diff options
| author | Rob Pike <r@golang.org> | 2012-03-14 15:08:54 +1100 |
|---|---|---|
| committer | Rob Pike <r@golang.org> | 2012-03-14 15:08:54 +1100 |
| commit | 214a1ca3c5d7f8d633587cf6faff2868f341b31b (patch) | |
| tree | 95138e97e56fe122c0b22397af7a5c23eea4c7bb /src/pkg/html | |
| parent | 9eeb90945eb56edc9095c662741b89170e522419 (diff) | |
| download | go-214a1ca3c5d7f8d633587cf6faff2868f341b31b.tar.xz | |
html/template: fix nil pointer bug
Fixes #3272.
R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5819046
Diffstat (limited to 'src/pkg/html')
| -rw-r--r-- | src/pkg/html/template/escape_test.go | 9 | ||||
| -rw-r--r-- | src/pkg/html/template/template.go | 12 |
2 files changed, 18 insertions, 3 deletions
diff --git a/src/pkg/html/template/escape_test.go b/src/pkg/html/template/escape_test.go index 2bbb1b1bc9..ce12c1795c 100644 --- a/src/pkg/html/template/escape_test.go +++ b/src/pkg/html/template/escape_test.go @@ -8,6 +8,7 @@ import ( "bytes" "encoding/json" "fmt" + "os" "strings" "testing" "text/template" @@ -1637,6 +1638,14 @@ func TestIndirectPrint(t *testing.T) { } } +// This is a test for issue 3272. +func TestEmptyTemplate(t *testing.T) { + page := Must(New("page").ParseFiles(os.DevNull)) + if err := page.ExecuteTemplate(os.Stdout, "page", "nothing"); err == nil { + t.Fatal("expected error") + } +} + func BenchmarkEscapedExecute(b *testing.B) { tmpl := Must(New("t").Parse(`<a onclick="alert('{{.}}')">{{.}}</a>`)) var buf bytes.Buffer diff --git a/src/pkg/html/template/template.go b/src/pkg/html/template/template.go index 95a3027c46..24c6c5276e 100644 --- a/src/pkg/html/template/template.go +++ b/src/pkg/html/template/template.go @@ -64,7 +64,13 @@ func (t *Template) lookupAndEscapeTemplate(name string) (tmpl *Template, err err t.nameSpace.mu.Lock() defer t.nameSpace.mu.Unlock() tmpl = t.set[name] - if (tmpl == nil) != (t.text.Lookup(name) == nil) { + if tmpl == nil { + return nil, fmt.Errorf("html/template: %q is undefined", name) + } + if tmpl.text.Tree == nil || tmpl.text.Root == nil { + return nil, fmt.Errorf("html/template: %q is an incomplete template", name) + } + if t.text.Lookup(name) == nil { panic("html/template internal error: template escaping out of sync") } if tmpl != nil && !tmpl.escaped { @@ -276,7 +282,7 @@ func (t *Template) ParseFiles(filenames ...string) (*Template, error) { func parseFiles(t *Template, filenames ...string) (*Template, error) { if len(filenames) == 0 { // Not really a problem, but be consistent. - return nil, fmt.Errorf("template: no files named in call to ParseFiles") + return nil, fmt.Errorf("html/template: no files named in call to ParseFiles") } for _, filename := range filenames { b, err := ioutil.ReadFile(filename) @@ -333,7 +339,7 @@ func parseGlob(t *Template, pattern string) (*Template, error) { return nil, err } if len(filenames) == 0 { - return nil, fmt.Errorf("template: pattern matches no files: %#q", pattern) + return nil, fmt.Errorf("html/template: pattern matches no files: %#q", pattern) } return parseFiles(t, filenames...) } |
