aboutsummaryrefslogtreecommitdiff
path: root/src/html
diff options
context:
space:
mode:
authorDaniel Martí <mvdan@mvdan.cc>2018-04-25 11:45:53 +0900
committerDaniel Martí <mvdan@mvdan.cc>2018-05-09 04:09:29 +0000
commit23e9dc79941be24d381d2e2c85600d4a3d0d6921 (patch)
tree89ccb2012f827e87fcca5c30a8285d1a4dd518b6 /src/html
parentc1492b6bd0735505d65a93016bb172f41b7a1924 (diff)
downloadgo-23e9dc79941be24d381d2e2c85600d4a3d0d6921.tar.gz
go-23e9dc79941be24d381d2e2c85600d4a3d0d6921.zip
html/template: always write untyped nil as JS null
text/template recently added support for passing untyped nil as function call arguments, as those would be mixed up with "missing argument" values before. See CL 95215. html/template now needs a small change to adapt to that new possibility. In particular, when printing values as JS bytes, its code was written under the assumption that the values would never be untyped nil - that is, the reflect.Value would always be valid. Short-circuit indirectToJSONMarshaler on an untyped nil, to avoid the panic and fall back to the existing " null " output. Before this change and on 1.10, printing a typed nil and an untyped nil resulted in: null "" After this change, one will get: null null Fixes #24717. Change-Id: I03cd10ef64b96e837bacc9ccf4cf25624d80de1c Reviewed-on: https://go-review.googlesource.com/109215 Run-TryBot: Daniel Martí <mvdan@mvdan.cc> TryBot-Result: Gobot Gobot <gobot@golang.org> Reviewed-by: Rhys Hiltner <rhys@justin.tv> Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Diffstat (limited to 'src/html')
-rw-r--r--src/html/template/js.go8
-rw-r--r--src/html/template/js_test.go1
2 files changed, 9 insertions, 0 deletions
diff --git a/src/html/template/js.go b/src/html/template/js.go
index 239395f8d3..e02fdb9751 100644
--- a/src/html/template/js.go
+++ b/src/html/template/js.go
@@ -123,6 +123,14 @@ var jsonMarshalType = reflect.TypeOf((*json.Marshaler)(nil)).Elem()
// indirectToJSONMarshaler returns the value, after dereferencing as many times
// as necessary to reach the base type (or nil) or an implementation of json.Marshal.
func indirectToJSONMarshaler(a interface{}) interface{} {
+ // text/template now supports passing untyped nil as a func call
+ // argument, so we must support it. Otherwise we'd panic below, as one
+ // cannot call the Type or Interface methods on an invalid
+ // reflect.Value. See golang.org/issue/18716.
+ if a == nil {
+ return nil
+ }
+
v := reflect.ValueOf(a)
for !v.Type().Implements(jsonMarshalType) && v.Kind() == reflect.Ptr && !v.IsNil() {
v = v.Elem()
diff --git a/src/html/template/js_test.go b/src/html/template/js_test.go
index 7484f60b54..cf2a0d2987 100644
--- a/src/html/template/js_test.go
+++ b/src/html/template/js_test.go
@@ -149,6 +149,7 @@ func TestJSValEscaper(t *testing.T) {
{"]]>", `"]]\u003e"`},
{"</script", `"\u003c/script"`},
{"\U0001D11E", "\"\U0001D11E\""}, // or "\uD834\uDD1E"
+ {nil, " null "},
}
for _, test := range tests {