diff options
| author | Ian Lance Taylor <iant@golang.org> | 2021-05-03 16:32:52 -0700 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2021-05-04 00:03:39 +0000 |
| commit | 496d7c691481966fd6ea806205aa025698a172af (patch) | |
| tree | fff6874472a75414215501f76584e955c9e1df52 /src/text/template/exec.go | |
| parent | 731a015ab8c8f44c7196123fd65b184a63d6835a (diff) | |
| download | go-496d7c691481966fd6ea806205aa025698a172af.tar.xz | |
text/template: add lock for Template.tmpl to fix data race
This adds a new lock protecting "tmpl".
This is a copy of https://golang.org/cl/257817 by Andreas Fleig,
updated for current tip, and updated to start running the
html/template TestEscapeRace test.
Thanks to @bep for providing the test case.
Fixes #39807
Change-Id: Ic8874484290283a49116812eeaffb8608346dc70
Reviewed-on: https://go-review.googlesource.com/c/go/+/316669
Trust: Ian Lance Taylor <iant@golang.org>
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Dmitri Shuralyov <dmitshur@golang.org>
Diffstat (limited to 'src/text/template/exec.go')
| -rw-r--r-- | src/text/template/exec.go | 9 |
1 files changed, 4 insertions, 5 deletions
diff --git a/src/text/template/exec.go b/src/text/template/exec.go index f1305a29a0..5ad3b4ec58 100644 --- a/src/text/template/exec.go +++ b/src/text/template/exec.go @@ -179,10 +179,7 @@ func errRecover(errp *error) { // A template may be executed safely in parallel, although if parallel // executions share a Writer the output may be interleaved. func (t *Template) ExecuteTemplate(wr io.Writer, name string, data interface{}) error { - var tmpl *Template - if t.common != nil { - tmpl = t.tmpl[name] - } + tmpl := t.Lookup(name) if tmpl == nil { return fmt.Errorf("template: no template %q associated with template %q", name, t.name) } @@ -230,6 +227,8 @@ func (t *Template) DefinedTemplates() string { return "" } var b strings.Builder + t.muTmpl.RLock() + defer t.muTmpl.RUnlock() for name, tmpl := range t.tmpl { if tmpl.Tree == nil || tmpl.Root == nil { continue @@ -401,7 +400,7 @@ func (s *state) walkRange(dot reflect.Value, r *parse.RangeNode) { func (s *state) walkTemplate(dot reflect.Value, t *parse.TemplateNode) { s.at(t) - tmpl := s.tmpl.tmpl[t.Name] + tmpl := s.tmpl.Lookup(t.Name) if tmpl == nil { s.errorf("template %q not defined", t.Name) } |
