From 8fba37abd6003f6460814fe6508f337f047d1c7c Mon Sep 17 00:00:00 2001 From: Bernhard Haumacher Date: Mon, 2 Oct 2023 06:14:16 +0200 Subject: [PATCH] Fixed NPE during reporting (#318) * Fixed potential NullPointerException. There is evidence that the key sets of the sourceProxies and reporters maps get inconsistent. I observe randomly failing builds that report the following error: ``` FATAL: Cannot invoke "java.util.List.iterator()" because the return value of "java.util.Map.get(Object)" is null java.lang.NullPointerException: Cannot invoke "java.util.List.iterator()" because the return value of "java.util.Map.get(Object)" is null at hudson.maven.AbstractMavenBuilder.end(AbstractMavenBuilder.java:101) at hudson.maven.MavenModuleSetBuild$MavenModuleSetBuildExecution.doRun(MavenModuleSetBuild.java:883) at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:526) at hudson.model.Run.execute(Run.java:1895) at hudson.maven.MavenModuleSetBuild.run(MavenModuleSetBuild.java:543) at hudson.model.ResourceController.execute(ResourceController.java:101) at hudson.model.Executor.run(Executor.java:442) ``` * Fixed indentation. --- src/main/java/hudson/maven/AbstractMavenBuilder.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/main/java/hudson/maven/AbstractMavenBuilder.java b/src/main/java/hudson/maven/AbstractMavenBuilder.java index ebf7a55b..0a9d01c0 100644 --- a/src/main/java/hudson/maven/AbstractMavenBuilder.java +++ b/src/main/java/hudson/maven/AbstractMavenBuilder.java @@ -98,7 +98,13 @@ protected AbstractMavenBuilder(BuildListener listener, Collection m void end(Launcher launcher) throws IOException, InterruptedException { for (Map.Entry e : sourceProxies.entrySet()) { ProxyImpl2 p = e.getValue(); - for (MavenReporter r : reporters.get(e.getKey())) { + ModuleName module = e.getKey(); + List moduleReporters = reporters.get(module); + if (moduleReporters == null) { + // Safety: Key set of reporter and source list has become inconsistent. + continue; + } + for (MavenReporter r : moduleReporters) { // we'd love to do this when the module build ends, but doing so requires // we know how many task segments are in the current build. r.end(p.owner(),launcher,listener);