aboutsummaryrefslogtreecommitdiff
path: root/src/text/template/exec.go
diff options
context:
space:
mode:
authorDaniel Martí <mvdan@mvdan.cc>2017-12-17 22:32:15 +0000
committerDaniel Martí <mvdan@mvdan.cc>2018-02-13 22:18:21 +0000
commit618f88d847af9a060a14794859d4f1ea51a08006 (patch)
tree0f8ecfedc871e621f62720e08977a16376eeb786 /src/text/template/exec.go
parent0ed5bec951e3068df3201254f615b5ad1d429ee0 (diff)
downloadgo-618f88d847af9a060a14794859d4f1ea51a08006.tar.xz
text/template: never call reflect.Zero(nil)
It makes no sense to try to get the zero value of a nil type, hence the panic. When we have a nil type, use reflect.ValueOf(nil) instead. This was showing itself if one used a missing field on the data between parentheses, when the data was a nil interface: t := template.Must(template.New("test").Parse(`{{ (.).foo }}`)) var v interface{} t.Execute(os.Stdout, v) Resulting in: panic: reflect: Zero(nil) [recovered] panic: reflect: Zero(nil) Fixes #21171. Change-Id: Ifcc4a0c67e6df425b65bc9f82fde6fcf03828579 Reviewed-on: https://go-review.googlesource.com/84482 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rob Pike <r@golang.org>
Diffstat (limited to 'src/text/template/exec.go')
-rw-r--r--src/text/template/exec.go6
1 files changed, 5 insertions, 1 deletions
diff --git a/src/text/template/exec.go b/src/text/template/exec.go
index 83c38cdf13..2ed5272349 100644
--- a/src/text/template/exec.go
+++ b/src/text/template/exec.go
@@ -691,8 +691,12 @@ func canBeNil(typ reflect.Type) bool {
// validateType guarantees that the value is valid and assignable to the type.
func (s *state) validateType(value reflect.Value, typ reflect.Type) reflect.Value {
if !value.IsValid() {
- if typ == nil || canBeNil(typ) {
+ if typ == nil {
// An untyped nil interface{}. Accept as a proper nil value.
+ return reflect.ValueOf(nil)
+ }
+ if canBeNil(typ) {
+ // Like above, but use the zero value of the non-nil type.
return reflect.Zero(typ)
}
s.errorf("invalid value; expected %s", typ)