This is an automated email from the ASF dual-hosted git repository.
gnodet pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/maven-resolver.git
The following commit(s) were added to refs/heads/master by this push:
new 16bbda7e6 Fix potential NPEs in IpcClient and resource leak in
DependencyGraphParser (#1945)
16bbda7e6 is described below
commit 16bbda7e6afebb133aed63fe36ade1c850804b07
Author: Guillaume Nodet <[email protected]>
AuthorDate: Tue Jul 7 16:53:56 2026 +0200
Fix potential NPEs in IpcClient and resource leak in DependencyGraphParser
(#1945)
- IpcClient.getJarPath(): use Class.getResource() which natively handles
bootstrap-loaded classes, and add null check for missing resources
- IpcClient.receive(): capture volatile input field in local variable
before use to prevent NPE from concurrent close()
- IpcClient.getAddress(): capture volatile socket field in local variable
with null check to prevent NPE during concurrent close()
- DependencyGraphParser.parseMultiResource(): wrap BufferedReader in
try-with-resources to prevent stream leak on exception
---
.../org/eclipse/aether/named/ipc/IpcClient.java | 23 +++++++++++++++++-----
.../internal/test/util/DependencyGraphParser.java | 15 +++++++-------
2 files changed, 26 insertions(+), 12 deletions(-)
diff --git
a/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcClient.java
b/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcClient.java
index 852bdcc66..2168bbb48 100644
---
a/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcClient.java
+++
b/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcClient.java
@@ -29,6 +29,7 @@ import java.io.InterruptedIOException;
import java.io.PrintWriter;
import java.io.RandomAccessFile;
import java.net.SocketAddress;
+import java.net.URL;
import java.nio.channels.ByteChannel;
import java.nio.channels.Channels;
import java.nio.channels.FileLock;
@@ -262,7 +263,11 @@ public class IpcClient {
private String getJarPath(Class<?> clazz) {
String classpath;
String className = clazz.getName().replace('.', '/') + ".class";
- String url = clazz.getClassLoader().getResource(className).toString();
+ URL resource = clazz.getResource("/" + className);
+ if (resource == null) {
+ throw new IllegalStateException("Unable to find resource for class
" + clazz.getName());
+ }
+ String url = resource.toString();
if (url.startsWith("jar:")) {
url = url.substring("jar:".length(), url.indexOf("!/"));
if (url.startsWith("file:")) {
@@ -288,11 +293,15 @@ public class IpcClient {
void receive() {
try {
while (true) {
- int id = input.readInt();
- int sz = input.readInt();
+ DataInputStream in = input;
+ if (in == null) {
+ throw new IOException("Connection closed");
+ }
+ int id = in.readInt();
+ int sz = in.readInt();
List<String> s = new ArrayList<>(sz);
for (int i = 0; i < sz; i++) {
- s.add(input.readUTF());
+ s.add(in.readUTF());
}
CompletableFuture<List<String>> f = responses.remove(id);
if (f == null) {
@@ -445,8 +454,12 @@ public class IpcClient {
}
private String getAddress() {
+ SocketChannel s = socket;
+ if (s == null) {
+ return "[closed]";
+ }
try {
- return SocketFamily.toString(socket.getLocalAddress());
+ return SocketFamily.toString(s.getLocalAddress());
} catch (IOException e) {
return "[not bound]";
}
diff --git
a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/DependencyGraphParser.java
b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/DependencyGraphParser.java
index 18da45bb7..b4c060fb2 100644
---
a/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/DependencyGraphParser.java
+++
b/maven-resolver-test-util/src/main/java/org/eclipse/aether/internal/test/util/DependencyGraphParser.java
@@ -158,14 +158,15 @@ public class DependencyGraphParser {
throw new IOException("Could not find classpath resource " +
prefix + resource);
}
- BufferedReader reader = new BufferedReader(new
InputStreamReader(res.openStream(), StandardCharsets.UTF_8));
-
- List<DependencyNode> ret = new ArrayList<>();
- DependencyNode root = null;
- while ((root = parse(reader)) != null) {
- ret.add(root);
+ try (BufferedReader reader =
+ new BufferedReader(new InputStreamReader(res.openStream(),
StandardCharsets.UTF_8))) {
+ List<DependencyNode> ret = new ArrayList<>();
+ DependencyNode root = null;
+ while ((root = parse(reader)) != null) {
+ ret.add(root);
+ }
+ return ret;
}
- return ret;
}
/**