From 4eda4fa06d70a26ad8c2e2c4108e00f5c317a5c0 Mon Sep 17 00:00:00 2001 From: zwwhdls Date: Tue, 21 Jan 2020 21:46:34 +0800 Subject: [PATCH 1/2] allow limited recursion in templates Signed-off-by: zwwhdls --- pkg/engine/engine.go | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/pkg/engine/engine.go b/pkg/engine/engine.go index d0261dca2..57ea04ef7 100644 --- a/pkg/engine/engine.go +++ b/pkg/engine/engine.go @@ -83,6 +83,7 @@ type renderable struct { const warnStartDelim = "HELM_ERR_START" const warnEndDelim = "HELM_ERR_END" +const recursionMaxNums = 1000 var warnRegex = regexp.MustCompile(warnStartDelim + `(.*)` + warnEndDelim) @@ -93,19 +94,20 @@ func warnWrap(warn string) string { // initFunMap creates the Engine's FuncMap and adds context-specific functions. func (e Engine) initFunMap(t *template.Template, referenceTpls map[string]renderable) { funcMap := funcMap() - includedNames := make([]string, 0) + includedNames := make(map[string]int) // Add the 'include' function here so we can close over t. funcMap["include"] = func(name string, data interface{}) (string, error) { var buf strings.Builder - for _, n := range includedNames { - if n == name { + if v, ok := includedNames[name]; ok { + if v > recursionMaxNums { return "", errors.Wrapf(fmt.Errorf("unable to execute template"), "rendering template has a nested reference name: %s", name) } + includedNames[name] ++ + } else { + includedNames[name] = 1 } - includedNames = append(includedNames, name) err := t.ExecuteTemplate(&buf, name, data) - includedNames = includedNames[:len(includedNames)-1] return buf.String(), err } From 16a85f757066c44aff6dacd8c598ac7a9d699eaa Mon Sep 17 00:00:00 2001 From: zwwhdls Date: Tue, 21 Jan 2020 22:04:13 +0800 Subject: [PATCH 2/2] fix test-style Signed-off-by: zwwhdls --- pkg/engine/engine.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/engine/engine.go b/pkg/engine/engine.go index 57ea04ef7..f777c5428 100644 --- a/pkg/engine/engine.go +++ b/pkg/engine/engine.go @@ -103,7 +103,7 @@ func (e Engine) initFunMap(t *template.Template, referenceTpls map[string]render if v > recursionMaxNums { return "", errors.Wrapf(fmt.Errorf("unable to execute template"), "rendering template has a nested reference name: %s", name) } - includedNames[name] ++ + includedNames[name]++ } else { includedNames[name] = 1 }