internal/lsp: fix data race in Templates code
The snapshot should be locked before iterating through the files.
Fixes golang/go#49072
Change-Id: I1bc805cbb760a9ad113064603863f030ef0ddda7
Reviewed-on: https://go-review.googlesource.com/c/tools/+/356911
Trust: Rebecca Stambler <rstambler@golang.org>
Run-TryBot: Rebecca Stambler <rstambler@golang.org>
gopls-CI: kokoro <noreply+kokoro@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Peter Weinberger <pjw@google.com>
diff --git a/internal/lsp/cache/snapshot.go b/internal/lsp/cache/snapshot.go
index 453db5a..90304cb 100644
--- a/internal/lsp/cache/snapshot.go
+++ b/internal/lsp/cache/snapshot.go
@@ -159,10 +159,15 @@
}
func (s *snapshot) Templates() map[span.URI]source.VersionedFileHandle {
- if !s.view.options.ExperimentalTemplateSupport {
+ if !s.view.Options().ExperimentalTemplateSupport {
return nil
}
+
ans := map[span.URI]source.VersionedFileHandle{}
+
+ s.mu.Lock()
+ defer s.mu.Unlock()
+
for k, x := range s.files {
if strings.HasSuffix(filepath.Ext(k.Filename()), "tmpl") {
ans[k] = x