Rob Pike has uploaded this change for review.
text/template: use reflect.Value.FieldByIndexErr
to avoid a crash on a nil pointer as an embedded field.
Fixes #48215
Change-Id: I214faa6e3cf08cdec1c01035e4bbca0900c6a408
---
M src/text/template/exec.go
M src/text/template/exec_test.go
2 files changed, 40 insertions(+), 1 deletion(-)
diff --git a/src/text/template/exec.go b/src/text/template/exec.go
index 9ae6fdc..7a0c29d 100644
--- a/src/text/template/exec.go
+++ b/src/text/template/exec.go
@@ -635,10 +635,13 @@
case reflect.Struct:
tField, ok := receiver.Type().FieldByName(fieldName)
if ok {
- field := receiver.FieldByIndex(tField.Index)
+ field, err := receiver.FieldByIndexErr(tField.Index)
if !tField.IsExported() {
s.errorf("%s is an unexported field of struct type %s", fieldName, typ)
}
+ if err != nil {
+ s.errorf("%v", err)
+ }
// If it's a function, we must call it.
if hasArgs {
s.errorf("%s has arguments but cannot be invoked as function", fieldName)
diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go
index 9c07729..3c40aa9 100644
--- a/src/text/template/exec_test.go
+++ b/src/text/template/exec_test.go
@@ -1787,3 +1787,26 @@
wg.Wait()
}
+
+// Issue 48215: embedded nil pointer causes panic.
+// Fixed by adding FieldByIndexErr to the reflect package.
+func TestIssue48215(t *testing.T) {
+ type A struct {
+ S string
+ }
+ type B struct {
+ *A
+ }
+ tmpl, err := New("").Parse(`{{ .S }}`)
+ if err != nil {
+ t.Fatal(err)
+ }
+ err = tmpl.Execute(io.Discard, B{})
+ // We expect an error, not a panic.
+ if err == nil {
+ t.Fatal("did not get error for nil embedded struct")
+ }
+ if !strings.Contains(err.Error(), "reflect: indirection through nil pointer to embedded struct field A") {
+ t.Fatal(err)
+ }
+}
To view, visit change 357963. To unsubscribe, or for help writing mail filters, visit settings.
Attention is currently required from: Rob Pike, Russ Cox.
Patch set 1:Code-Review +2
Rob Pike submitted this change.
text/template: use reflect.Value.FieldByIndexErr
to avoid a crash on a nil pointer as an embedded field.
Fixes #48215
Change-Id: I214faa6e3cf08cdec1c01035e4bbca0900c6a408
Reviewed-on: https://go-review.googlesource.com/c/go/+/357963
Trust: Rob Pike <r...@golang.org>
Run-TryBot: Rob Pike <r...@golang.org>
TryBot-Result: Go Bot <go...@golang.org>
Reviewed-by: Ian Lance Taylor <ia...@golang.org>
---
M src/text/template/exec.go
M src/text/template/exec_test.go
2 files changed, 45 insertions(+), 1 deletion(-)
diff --git a/src/text/template/exec.go b/src/text/template/exec.go
index 7e44497..c42cbb2 100644
To view, visit change 357963. To unsubscribe, or for help writing mail filters, visit settings.