Skip to content

Commit 1025821

Browse files
fmeumcopybara-github
authored andcommitted
Fix two incorrect usages of SkyframeLookupResult
All the values have to be checked for nullness individually. Fixes the following two NPEs: 1. bazel-contrib/rules_go#4531 (comment) ``` java.lang.NullPointerException: Cannot invoke "com.google.devtools.build.lib.skyframe.PackageValue.getPackage()" because the return value of "com.google.devtools.build.skyframe.SkyframeLookupResult.getOrThrow(com.google.devtools.build.skyframe.SkyKey, java.lang.Class)" is null at com.google.devtools.build.lib.skyframe.TestExpansionFunction.getPrerequisites(TestExpansionFunction.java:169) at com.google.devtools.build.lib.skyframe.TestExpansionFunction.computeExpandedTests(TestExpansionFunction.java:85) ... ``` 2. #27942 ``` java.lang.NullPointerException at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.base/java.util.stream.ReferencePipeline$3$1.accept(Unknown Source) at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Unknown Source) at java.base/java.util.stream.AbstractPipeline.copyInto(Unknown Source) at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(Unknown Source) at java.base/java.util.stream.ReduceOps$ReduceOp.evaluateSequential(Unknown Source) at java.base/java.util.stream.AbstractPipeline.evaluate(Unknown Source) at java.base/java.util.stream.ReferencePipeline.collect(Unknown Source) at com.google.devtools.build.lib.skyframe.DirectoryTreeDigestFunction.getSubDirTreeDigests(DirectoryTreeDigestFunction.java:140) at com.google.devtools.build.lib.skyframe.DirectoryTreeDigestFunction.compute(DirectoryTreeDigestFunction.java:65) ``` Speculative fix for #27942 Closes #27959. PiperOrigin-RevId: 843808256 Change-Id: I012756ec8a641c68bca31fe155d230caa00d8a3f
1 parent 195502f commit 1025821

File tree

2 files changed

+13
-14
lines changed

2 files changed

+13
-14
lines changed

src/main/java/com/google/devtools/build/lib/skyframe/DirectoryTreeDigestFunction.java

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
import com.google.devtools.build.skyframe.SkyValue;
3030
import com.google.devtools.build.skyframe.SkyframeLookupResult;
3131
import java.io.IOException;
32+
import java.util.Objects;
3233
import java.util.stream.StreamSupport;
3334
import javax.annotation.Nullable;
3435

@@ -129,19 +130,15 @@ private static ImmutableList<String> getSubDirTreeDigests(
129130
.map(p -> DirectoryTreeDigestValue.key(p.getSecond().realRootedPath(p.getFirst())))
130131
.collect(toImmutableSet());
131132
SkyframeLookupResult result = env.getValuesAndExceptions(dirTreeDigestValueKeys);
132-
if (env.valuesMissing()) {
133-
return null;
134-
}
135-
ImmutableList<String> dirTreeDigests =
136-
dirTreeDigestValueKeys.stream()
137-
.map(result::get)
138-
.map(DirectoryTreeDigestValue.class::cast)
139-
.map(DirectoryTreeDigestValue::hexDigest)
140-
.collect(toImmutableList());
141-
if (env.valuesMissing()) {
133+
if (env.valuesMissing()
134+
|| dirTreeDigestValueKeys.stream().map(result::get).anyMatch(Objects::isNull)) {
142135
return null;
143136
}
144-
return dirTreeDigests;
137+
return dirTreeDigestValueKeys.stream()
138+
.map(result::get)
139+
.map(DirectoryTreeDigestValue.class::cast)
140+
.map(DirectoryTreeDigestValue::hexDigest)
141+
.collect(toImmutableList());
145142
}
146143

147144
private static final class DirectoryTreeDigestFunctionException extends SkyFunctionException {

src/main/java/com/google/devtools/build/lib/skyframe/TestExpansionFunction.java

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -164,9 +164,11 @@ private static boolean getPrerequisites(
164164
Map<PackageIdentifier, Package> packageMap = new HashMap<>();
165165
for (PackageIdentifier key : pkgIdentifiers) {
166166
try {
167-
packageMap.put(
168-
key,
169-
((PackageValue) packages.getOrThrow(key, NoSuchPackageException.class)).getPackage());
167+
var packageValue = (PackageValue) packages.getOrThrow(key, NoSuchPackageException.class);
168+
if (packageValue == null) {
169+
return false;
170+
}
171+
packageMap.put(key, packageValue.getPackage());
170172
} catch (NoSuchPackageException e) {
171173
env.getListener().handle(Event.error(e.getMessage()));
172174
hasError = true;

0 commit comments

Comments
 (0)