shithub: hugo

Download patch

ref: be017f187e7c9beac6baabdba32bdb5753f9b4d4
parent: be3b8a132ba72aa3a797101f942e555610553f72
author: bep <[email protected]>
date: Thu Apr 30 07:26:34 EDT 2015

tpl: check slice bounds in slicestr

Fixes #1090

--- a/tpl/template_funcs.go
+++ b/tpl/template_funcs.go
@@ -139,7 +139,14 @@
 		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 startEnd[1] < 0 || startEnd[1] > len(aStr) {
+			return "", errors.New("slice bounds out of range")
+		}
 		return aStr[startEnd[0]:startEnd[1]], nil
 	} else if len(startEnd) == 1 {
 		return aStr[startEnd[0]:], nil
--- a/tpl/template_funcs_test.go
+++ b/tpl/template_funcs_test.go
@@ -291,6 +291,11 @@
 		{"abcdef", []int{2}, "cdef"},
 		{123, []int{1, 3}, "23"},
 		{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},
 	} {
 		result, err := Slicestr(this.v1, this.v2...)
--- a/tpl/template_test.go
+++ b/tpl/template_test.go
@@ -11,7 +11,11 @@
 	for i, this := range []struct {
 		data      string
 		expectErr int
-	}{{"{{apply .C \"first\" }}", 2}} {
+	}{
+		// Issue #1089
+		{"{{apply .C \"first\" }}", 2},
+		// Issue #1090
+		{"{{ slicestr \"000000\" 10}}", 2}} {
 		templ := New()
 
 		d := &Data{