]> Cypherpunks repositories - gostls13.git/commitdiff
html/template: fix nil pointer bug
authorRob Pike <r@golang.org>
Wed, 14 Mar 2012 04:08:54 +0000 (15:08 +1100)
committerRob Pike <r@golang.org>
Wed, 14 Mar 2012 04:08:54 +0000 (15:08 +1100)
Fixes #3272.

R=golang-dev, rsc
CC=golang-dev
https://golang.org/cl/5819046

src/pkg/html/template/escape_test.go
src/pkg/html/template/template.go

index 2bbb1b1bc94cfb40341b15d8b9696bc5db9a7f53..ce12c1795c24ee81926523fab7695be789e5f836 100644 (file)
@@ -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
index 95a3027c46a183aa46790ecff1bb78bc8855586c..24c6c5276e7d183d60a9aa373a6031ac6a09d774 100644 (file)
@@ -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...)
 }