Skip to content

Commit 46f0582

Browse files
committed
internal/lsp/cache: handle a nil pointer exception in analysis
Updates golang/go#35339 Change-Id: I2611b1a61bcf777fe4ce0f5446d1897c5698af86 Reviewed-on: https://go-review.googlesource.com/c/tools/+/205859 Run-TryBot: Rebecca Stambler <[email protected]> TryBot-Result: Gobot Gobot <[email protected]> Reviewed-by: Ian Cottrell <[email protected]> (cherry picked from commit b93886d) Reviewed-on: https://go-review.googlesource.com/c/tools/+/206149 Reviewed-by: Heschi Kreinick <[email protected]>
1 parent 2b2ab33 commit 46f0582

File tree

1 file changed

+20
-15
lines changed

1 file changed

+20
-15
lines changed

internal/lsp/cache/analysis.go

Lines changed: 20 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,9 @@ func (act *actionHandle) analyze(ctx context.Context) ([]*source.Error, interfac
148148
if !ok {
149149
return nil, nil, errors.Errorf("unexpected type for %s:%s", act.pkg.ID(), act.analyzer.Name)
150150
}
151+
if data == nil {
152+
return nil, nil, errors.Errorf("unexpected nil analysis for %s:%s", act.pkg.ID(), act.analyzer.Name)
153+
}
151154
return data.diagnostics, data.result, data.err
152155
}
153156

@@ -160,6 +163,9 @@ func (act *actionHandle) cached() ([]*source.Error, interface{}, error) {
160163
if !ok {
161164
return nil, nil, errors.Errorf("unexpected type for %s:%s", act.pkg.ID(), act.analyzer.Name)
162165
}
166+
if data == nil {
167+
return nil, nil, errors.Errorf("unexpected nil cached analysis for %s:%s", act.pkg.ID(), act.analyzer.Name)
168+
}
163169
return data.diagnostics, data.result, data.err
164170
}
165171

@@ -213,8 +219,6 @@ func runAnalysis(ctx context.Context, fset *token.FileSet, analyzer *analysis.An
213219
// Plumb the output values of the dependencies
214220
// into the inputs of this action. Also facts.
215221
inputs := make(map[*analysis.Analyzer]interface{})
216-
objectFacts := make(map[objectFactKey]analysis.Fact)
217-
packageFacts := make(map[packageFactKey]analysis.Fact)
218222

219223
for depHandle, depData := range deps {
220224
if depHandle.pkg == pkg {
@@ -233,14 +237,14 @@ func runAnalysis(ctx context.Context, fset *token.FileSet, analyzer *analysis.An
233237
if !exportedFrom(key.obj, depHandle.pkg.types) {
234238
continue
235239
}
236-
objectFacts[key] = fact
240+
data.objectFacts[key] = fact
237241
}
238242
for key, fact := range depData.packageFacts {
239243
// TODO: filter out facts that belong to
240244
// packages not mentioned in the export data
241245
// to prevent side channels.
242246

243-
packageFacts[key] = fact
247+
data.packageFacts[key] = fact
244248
}
245249
}
246250
}
@@ -271,7 +275,7 @@ func runAnalysis(ctx context.Context, fset *token.FileSet, analyzer *analysis.An
271275
}
272276
key := objectFactKey{obj, factType(ptr)}
273277

274-
if v, ok := objectFacts[key]; ok {
278+
if v, ok := data.objectFacts[key]; ok {
275279
reflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem())
276280
return true
277281
}
@@ -283,34 +287,34 @@ func runAnalysis(ctx context.Context, fset *token.FileSet, analyzer *analysis.An
283287
analyzer, pkg.ID(), obj, fact))
284288
}
285289
key := objectFactKey{obj, factType(fact)}
286-
objectFacts[key] = fact // clobber any existing entry
290+
data.objectFacts[key] = fact // clobber any existing entry
287291
},
288292
ImportPackageFact: func(pkg *types.Package, ptr analysis.Fact) bool {
289293
if pkg == nil {
290294
panic("nil package")
291295
}
292296
key := packageFactKey{pkg, factType(ptr)}
293-
if v, ok := packageFacts[key]; ok {
297+
if v, ok := data.packageFacts[key]; ok {
294298
reflect.ValueOf(ptr).Elem().Set(reflect.ValueOf(v).Elem())
295299
return true
296300
}
297301
return false
298302
},
299303
ExportPackageFact: func(fact analysis.Fact) {
300304
key := packageFactKey{pkg.types, factType(fact)}
301-
packageFacts[key] = fact // clobber any existing entry
305+
data.packageFacts[key] = fact // clobber any existing entry
302306
},
303307
AllObjectFacts: func() []analysis.ObjectFact {
304-
facts := make([]analysis.ObjectFact, 0, len(objectFacts))
305-
for k := range objectFacts {
306-
facts = append(facts, analysis.ObjectFact{Object: k.obj, Fact: objectFacts[k]})
308+
facts := make([]analysis.ObjectFact, 0, len(data.objectFacts))
309+
for k := range data.objectFacts {
310+
facts = append(facts, analysis.ObjectFact{Object: k.obj, Fact: data.objectFacts[k]})
307311
}
308312
return facts
309313
},
310314
AllPackageFacts: func() []analysis.PackageFact {
311-
facts := make([]analysis.PackageFact, 0, len(packageFacts))
312-
for k := range packageFacts {
313-
facts = append(facts, analysis.PackageFact{Package: k.pkg, Fact: packageFacts[k]})
315+
facts := make([]analysis.PackageFact, 0, len(data.packageFacts))
316+
for k := range data.packageFacts {
317+
facts = append(facts, analysis.PackageFact{Package: k.pkg, Fact: data.packageFacts[k]})
314318
}
315319
return facts
316320
},
@@ -341,7 +345,8 @@ func runAnalysis(ctx context.Context, fset *token.FileSet, analyzer *analysis.An
341345
for _, diag := range diagnostics {
342346
srcErr, err := sourceError(ctx, fset, pkg, diag)
343347
if err != nil {
344-
return nil
348+
data.err = err
349+
return data
345350
}
346351
data.diagnostics = append(data.diagnostics, srcErr)
347352
}

0 commit comments

Comments
 (0)