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_test.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_test.go')
| -rw-r--r-- | src/text/template/exec_test.go | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/text/template/exec_test.go b/src/text/template/exec_test.go index 255b111b34..e73fce4fa8 100644 --- a/src/text/template/exec_test.go +++ b/src/text/template/exec_test.go @@ -12,6 +12,7 @@ import ( "io" "reflect" "strings" + "sync" "testing" ) @@ -1732,3 +1733,40 @@ func TestIssue43065(t *testing.T) { t.Errorf("%s", err) } } + +// Issue 39807: data race in html/template & text/template +func TestIssue39807(t *testing.T) { + var wg sync.WaitGroup + + tplFoo, err := New("foo").Parse(`{{ template "bar" . }}`) + if err != nil { + t.Error(err) + } + + tplBar, err := New("bar").Parse("bar") + if err != nil { + t.Error(err) + } + + gofuncs := 10 + numTemplates := 10 + + for i := 1; i <= gofuncs; i++ { + wg.Add(1) + go func() { + defer wg.Done() + for j := 0; j < numTemplates; j++ { + _, err := tplFoo.AddParseTree(tplBar.Name(), tplBar.Tree) + if err != nil { + t.Error(err) + } + err = tplFoo.Execute(io.Discard, nil) + if err != nil { + t.Error(err) + } + } + }() + } + + wg.Wait() +} |
