diff --git a/tpl/strings/strings.go b/tpl/strings/strings.go index 796b8ff62..7bd6a9af0 100644 --- a/tpl/strings/strings.go +++ b/tpl/strings/strings.go @@ -17,7 +17,6 @@ import ( "errors" "fmt" "html/template" - "math" _strings "strings" "unicode/utf8" @@ -420,7 +419,6 @@ func (ns *Namespace) TrimSuffix(suffix, s interface{}) (string, error) { } // Repeat returns a new string consisting of count copies of the string s. -// The count is limited to an in16 value (up to 32767). func (ns *Namespace) Repeat(n, s interface{}) (string, error) { ss, err := cast.ToStringE(s) if err != nil { @@ -432,8 +430,10 @@ func (ns *Namespace) Repeat(n, s interface{}) (string, error) { return "", err } - if sn > math.MaxInt16 { - return "", fmt.Errorf("Cannot repeat string more than %d times", math.MaxInt16) + if sn < 0 { + return "", errors.New("strings: negative Repeat count") + } else if sn > 0 && len(ss)*sn/sn != len(ss) { + return "", errors.New("strings: Repeat count causes overflow") } return _strings.Repeat(ss, sn), nil diff --git a/tpl/strings/strings_test.go b/tpl/strings/strings_test.go index bf19ad562..6f714702c 100644 --- a/tpl/strings/strings_test.go +++ b/tpl/strings/strings_test.go @@ -730,7 +730,7 @@ func TestRepeat(t *testing.T) { // errors {"", tstNoStringer{}, false}, {tstNoStringer{}, "", false}, - {"hi", math.MaxInt16 + 1, false}, + {"ab", math.MaxInt64, false}, } { errMsg := fmt.Sprintf("[%d] %v", i, test)