mirror of https://github.com/golang/go.git
text/template: don't panic when function call evaluates a nil pointer
Catch the error instead and return it to the user. Before this fix,
the template package panicked. Now you get:
template: bug11:1:14: executing "bug11" at <.PS>: dereference of nil pointer of type *string
Extended example at http://play.golang.org/p/uP6pCW3qKT
Fixes #7333.
LGTM=rsc
R=rsc
CC=golang-codereviews
https://golang.org/cl/64150043
This commit is contained in:
parent
881e23d36f
commit
71575a97ab
|
|
@ -594,6 +594,9 @@ func (s *state) validateType(value reflect.Value, typ reflect.Type) reflect.Valu
|
|||
switch {
|
||||
case value.Kind() == reflect.Ptr && value.Type().Elem().AssignableTo(typ):
|
||||
value = value.Elem()
|
||||
if !value.IsValid() {
|
||||
s.errorf("dereference of nil pointer of type %s", typ)
|
||||
}
|
||||
case reflect.PtrTo(value.Type()).AssignableTo(typ) && value.CanAddr():
|
||||
value = value.Addr()
|
||||
default:
|
||||
|
|
|
|||
|
|
@ -512,6 +512,8 @@ var execTests = []execTest{
|
|||
{"bug9", "{{.cause}}", "neglect", map[string]string{"cause": "neglect"}, true},
|
||||
// Field chain starting with function did not work.
|
||||
{"bug10", "{{mapOfThree.three}}-{{(mapOfThree).three}}", "3-3", 0, true},
|
||||
// Dereferencing nil pointer while evaluating function arguments should not panic. Issue 7333.
|
||||
{"bug11", "{{valueString .PS}}", "", T{}, false},
|
||||
}
|
||||
|
||||
func zeroArgs() string {
|
||||
|
|
@ -546,6 +548,11 @@ func vfunc(V, *V) string {
|
|||
return "vfunc"
|
||||
}
|
||||
|
||||
// valueString takes a string, not a pointer.
|
||||
func valueString(v string) string {
|
||||
return "value is ignored"
|
||||
}
|
||||
|
||||
func add(args ...int) int {
|
||||
sum := 0
|
||||
for _, x := range args {
|
||||
|
|
@ -580,17 +587,18 @@ func mapOfThree() interface{} {
|
|||
func testExecute(execTests []execTest, template *Template, t *testing.T) {
|
||||
b := new(bytes.Buffer)
|
||||
funcs := FuncMap{
|
||||
"add": add,
|
||||
"count": count,
|
||||
"dddArg": dddArg,
|
||||
"echo": echo,
|
||||
"makemap": makemap,
|
||||
"mapOfThree": mapOfThree,
|
||||
"oneArg": oneArg,
|
||||
"stringer": stringer,
|
||||
"typeOf": typeOf,
|
||||
"vfunc": vfunc,
|
||||
"zeroArgs": zeroArgs,
|
||||
"add": add,
|
||||
"count": count,
|
||||
"dddArg": dddArg,
|
||||
"echo": echo,
|
||||
"makemap": makemap,
|
||||
"mapOfThree": mapOfThree,
|
||||
"oneArg": oneArg,
|
||||
"stringer": stringer,
|
||||
"typeOf": typeOf,
|
||||
"valueString": valueString,
|
||||
"vfunc": vfunc,
|
||||
"zeroArgs": zeroArgs,
|
||||
}
|
||||
for _, test := range execTests {
|
||||
var tmpl *Template
|
||||
|
|
|
|||
Loading…
Reference in New Issue