From 90c774908530390daa5813fcdd31435999971359 Mon Sep 17 00:00:00 2001
From: =?utf8?q?Bj=C3=B8rn=20Erik=20Pedersen?=
 <bjorn.erik.pedersen@gmail.com>
Date: Sun, 3 Jun 2018 10:35:45 +0300
Subject: [PATCH] tpl/strings: Adjust the overflow validation in strings.Repeat

This now matches the validation in the stdlib, but we return an error instead.
---
 tpl/strings/strings.go      | 8 ++++----
 tpl/strings/strings_test.go | 2 +-
 2 files changed, 5 insertions(+), 5 deletions(-)

diff --git a/tpl/strings/strings.go b/tpl/strings/strings.go
index 796b8ff6..7bd6a9af 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 bf19ad56..6f714702 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)
 
-- 
2.30.2