Skip to content

Commit 63b3b5a

Browse files
committed
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. Fixes golang/go#66490 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]>
1 parent 3f9badb commit 63b3b5a

File tree

2 files changed

+16
-10
lines changed

2 files changed

+16
-10
lines changed

internal/imports/fix.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -996,8 +996,10 @@ func (e *ProcessEnv) GetResolver() (Resolver, error) {
996996
// already know the view type.
997997
if len(e.Env["GOMOD"]) == 0 && len(e.Env["GOWORK"]) == 0 {
998998
e.resolver = newGopathResolver(e)
999+
} else if r, err := newModuleResolver(e, e.ModCache); err != nil {
1000+
e.resolverErr = err
9991001
} else {
1000-
e.resolver, e.resolverErr = newModuleResolver(e, e.ModCache)
1002+
e.resolver = Resolver(r)
10011003
}
10021004
}
10031005

internal/imports/mod.go

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

0 commit comments

Comments
 (0)