[go] text/template: use reflect.Value.FieldByIndexErr

28 views
Skip to first unread message

Rob Pike (Gerrit)

unread,
Oct 24, 2021, 12:45:27 AM10/24/21
to goph...@pubsubhelper.golang.org, Rob Pike, golang-co...@googlegroups.com

Rob Pike has uploaded this change for review.

View Change

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.

Gerrit-Project: go
Gerrit-Branch: master
Gerrit-Change-Id: I214faa6e3cf08cdec1c01035e4bbca0900c6a408
Gerrit-Change-Number: 357963
Gerrit-PatchSet: 1
Gerrit-Owner: Rob Pike <r...@golang.org>
Gerrit-Reviewer: Rob Pike <r...@golang.org>
Gerrit-MessageType: newchange

Ian Lance Taylor (Gerrit)

unread,
Oct 27, 2021, 6:10:21 PM10/27/21
to Rob Pike, goph...@pubsubhelper.golang.org, Russ Cox, Go Bot, golang-co...@googlegroups.com

Attention is currently required from: Rob Pike, Russ Cox.

Patch set 1:Code-Review +2

View Change

    To view, visit change 357963. To unsubscribe, or for help writing mail filters, visit settings.

    Gerrit-Project: go
    Gerrit-Branch: master
    Gerrit-Change-Id: I214faa6e3cf08cdec1c01035e4bbca0900c6a408
    Gerrit-Change-Number: 357963
    Gerrit-PatchSet: 1
    Gerrit-Owner: Rob Pike <r...@golang.org>
    Gerrit-Reviewer: Go Bot <go...@golang.org>
    Gerrit-Reviewer: Ian Lance Taylor <ia...@golang.org>
    Gerrit-Reviewer: Rob Pike <r...@golang.org>
    Gerrit-Reviewer: Russ Cox <r...@golang.org>
    Gerrit-Attention: Rob Pike <r...@golang.org>
    Gerrit-Attention: Russ Cox <r...@golang.org>
    Gerrit-Comment-Date: Wed, 27 Oct 2021 22:10:14 +0000
    Gerrit-HasComments: No
    Gerrit-Has-Labels: Yes
    Gerrit-MessageType: comment

    Rob Pike (Gerrit)

    unread,
    Oct 28, 2021, 10:12:10 PM10/28/21
    to Rob Pike, goph...@pubsubhelper.golang.org, golang-...@googlegroups.com, Ian Lance Taylor, Russ Cox, Go Bot, golang-co...@googlegroups.com

    Rob Pike submitted this change.

    View Change


    Approvals: Ian Lance Taylor: Looks good to me, approved Rob Pike: Trusted; Run TryBots Go Bot: TryBots succeeded
    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.

    Gerrit-Project: go
    Gerrit-Branch: master
    Gerrit-Change-Id: I214faa6e3cf08cdec1c01035e4bbca0900c6a408
    Gerrit-Change-Number: 357963
    Gerrit-PatchSet: 2
    Gerrit-Owner: Rob Pike <r...@golang.org>
    Gerrit-Reviewer: Go Bot <go...@golang.org>
    Gerrit-Reviewer: Ian Lance Taylor <ia...@golang.org>
    Gerrit-Reviewer: Rob Pike <r...@golang.org>
    Gerrit-Reviewer: Russ Cox <r...@golang.org>
    Gerrit-MessageType: merged
    Reply all
    Reply to author
    Forward
    0 new messages