Skip to content

Commit

Permalink
[gopls-release-branch.0.15] internal/imports: fix two "nil pointer in…
Browse files Browse the repository at this point in the history
… interface" bugs

CL 559635 changed newModuleResolver so that it can return
(nil, err). That means it is no longer safe to unconditionally
convert the first result to a Resolver interface, but we
forgot to check in two places, causing a crash that was
reported by telemetry.

This change adds the two checks.

Updates golang/go#66490
Updates golang/go#66730

Change-Id: I3f2b84ed792b1eea179fc0d4d5ee9843281506fc
Reviewed-on: https://go-review.googlesource.com/c/tools/+/574136
Reviewed-by: Peter Weinberger <pjw@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
(cherry picked from commit 63b3b5a)
Reviewed-on: https://go-review.googlesource.com/c/tools/+/577297
Reviewed-by: Alan Donovan <adonovan@google.com>
  • Loading branch information
adonovan authored and findleyr committed Apr 8, 2024
1 parent cf20026 commit 5a4dc7e
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 10 deletions.
4 changes: 3 additions & 1 deletion internal/imports/fix.go
Original file line number Diff line number Diff line change
Expand Up @@ -988,8 +988,10 @@ func (e *ProcessEnv) GetResolver() (Resolver, error) {
// already know the view type.
if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 {
e.resolver = newGopathResolver(e)
} else if r, err := newModuleResolver(e, e.ModCache); err != nil {
e.resolverErr = err
} else {
e.resolver, e.resolverErr = newModuleResolver(e, e.ModCache)
e.resolver = Resolver(r)
}
}

Expand Down
22 changes: 13 additions & 9 deletions internal/imports/mod.go
Original file line number Diff line number Diff line change
Expand Up @@ -313,15 +313,19 @@ func (r *ModuleResolver) ClearForNewScan() Resolver {
// TODO(rfindley): move this to a new env.go, consolidating ProcessEnv methods.
func (e *ProcessEnv) ClearModuleInfo() {
if r, ok := e.resolver.(*ModuleResolver); ok {
resolver, resolverErr := newModuleResolver(e, e.ModCache)
if resolverErr == nil {
<-r.scanSema // acquire (guards caches)
resolver.moduleCacheCache = r.moduleCacheCache
resolver.otherCache = r.otherCache
r.scanSema <- struct{}{} // release
}
e.resolver = resolver
e.resolverErr = resolverErr
resolver, err := newModuleResolver(e, e.ModCache)
if err != nil {
e.resolver = nil
e.resolverErr = err
return
}

<-r.scanSema // acquire (guards caches)
resolver.moduleCacheCache = r.moduleCacheCache
resolver.otherCache = r.otherCache
r.scanSema <- struct{}{} // release

e.UpdateResolver(resolver)
}
}

Expand Down

0 comments on commit 5a4dc7e

Please sign in to comment.