Skip to content

Commit 5a4dc7e

Browse files
adonovanfindleyr
authored andcommitted
[gopls-release-branch.0.15] internal/imports: fix two "nil pointer in 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 <[email protected]> LUCI-TryBot-Result: Go LUCI <[email protected]> (cherry picked from commit 63b3b5a) Reviewed-on: https://go-review.googlesource.com/c/tools/+/577297 Reviewed-by: Alan Donovan <[email protected]>
1 parent cf20026 commit 5a4dc7e

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

internal/imports/fix.go

+3-1
Original file line numberDiff line numberDiff line change
@@ -988,8 +988,10 @@ func (e *ProcessEnv) GetResolver() (Resolver, error) {
988988
// already know the view type.
989989
if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 {
990990
e.resolver = newGopathResolver(e)
991+
} else if r, err := newModuleResolver(e, e.ModCache); err != nil {
992+
e.resolverErr = err
991993
} else {
992-
e.resolver, e.resolverErr = newModuleResolver(e, e.ModCache)
994+
e.resolver = Resolver(r)
993995
}
994996
}
995997

internal/imports/mod.go

+13-9
Original file line numberDiff line numberDiff line change
@@ -313,15 +313,19 @@ func (r *ModuleResolver) ClearForNewScan() Resolver {
313313
// TODO(rfindley): move this to a new env.go, consolidating ProcessEnv methods.
314314
func (e *ProcessEnv) ClearModuleInfo() {
315315
if r, ok := e.resolver.(*ModuleResolver); ok {
316-
resolver, resolverErr := newModuleResolver(e, e.ModCache)
317-
if resolverErr == nil {
318-
<-r.scanSema // acquire (guards caches)
319-
resolver.moduleCacheCache = r.moduleCacheCache
320-
resolver.otherCache = r.otherCache
321-
r.scanSema <- struct{}{} // release
322-
}
323-
e.resolver = resolver
324-
e.resolverErr = resolverErr
316+
resolver, err := newModuleResolver(e, e.ModCache)
317+
if err != nil {
318+
e.resolver = nil
319+
e.resolverErr = err
320+
return
321+
}
322+
323+
<-r.scanSema // acquire (guards caches)
324+
resolver.moduleCacheCache = r.moduleCacheCache
325+
resolver.otherCache = r.otherCache
326+
r.scanSema <- struct{}{} // release
327+
328+
e.UpdateResolver(resolver)
325329
}
326330
}
327331

0 commit comments

Comments
 (0)