tpl: check slice bounds in slicestr

Fixes #1090
This commit is contained in:
bep 2015-04-30 11:26:34 +02:00
parent be3b8a132b
commit be017f187e
3 changed files with 17 additions and 1 deletions

View file

@ -139,7 +139,14 @@ func Slicestr(a interface{}, startEnd ...int) (string, error) {
return "", errors.New("too many arguments") return "", errors.New("too many arguments")
} }
if len(startEnd) > 0 && (startEnd[0] < 0 || startEnd[0] >= len(aStr)) {
return "", errors.New("slice bounds out of range")
}
if len(startEnd) == 2 { if len(startEnd) == 2 {
if startEnd[1] < 0 || startEnd[1] > len(aStr) {
return "", errors.New("slice bounds out of range")
}
return aStr[startEnd[0]:startEnd[1]], nil return aStr[startEnd[0]:startEnd[1]], nil
} else if len(startEnd) == 1 { } else if len(startEnd) == 1 {
return aStr[startEnd[0]:], nil return aStr[startEnd[0]:], nil

View file

@ -291,6 +291,11 @@ func TestSlicestr(t *testing.T) {
{"abcdef", []int{2}, "cdef"}, {"abcdef", []int{2}, "cdef"},
{123, []int{1, 3}, "23"}, {123, []int{1, 3}, "23"},
{123, []int{1, 2, 3}, false}, {123, []int{1, 2, 3}, false},
{"abcdef", []int{6}, false},
{"abcdef", []int{4, 7}, false},
{"abcdef", []int{-1}, false},
{"abcdef", []int{-1, 7}, false},
{"abcdef", []int{1, -1}, false},
{tstNoStringer{}, []int{0, 1}, false}, {tstNoStringer{}, []int{0, 1}, false},
} { } {
result, err := Slicestr(this.v1, this.v2...) result, err := Slicestr(this.v1, this.v2...)

View file

@ -11,7 +11,11 @@ func TestTplGoFuzzReports(t *testing.T) {
for i, this := range []struct { for i, this := range []struct {
data string data string
expectErr int expectErr int
}{{"{{apply .C \"first\" }}", 2}} { }{
// Issue #1089
{"{{apply .C \"first\" }}", 2},
// Issue #1090
{"{{ slicestr \"000000\" 10}}", 2}} {
templ := New() templ := New()
d := &Data{ d := &Data{