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

commit dc2c84ff9de73ed5d707b7f5c1f3e23469d9b615
Author: Guillaume Nodet <[email protected]>
AuthorDate: Sun Jun 7 09:43:56 2026 +0000

    Fix IpcServer unlock — replace TOCTOU isEmpty+remove with atomic compute
    
    The unlock() path had a race: after checking l.isEmpty(), another
    thread could computeIfAbsent and re-use the same Lock object, then
    the remove(l.key, l) would remove a Lock that now has holders.
    
    Replace the two-step isEmpty() check + remove() with a single
    locks.compute() call that atomically checks emptiness and removes.
---
 .../src/main/java/org/eclipse/aether/named/ipc/IpcServer.java         | 4 +---
 1 file changed, 1 insertion(+), 3 deletions(-)

diff --git 
a/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcServer.java
 
b/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcServer.java
index b7ae0a03f..6d5470fd2 100644
--- 
a/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcServer.java
+++ 
b/maven-resolver-named-locks-ipc/src/main/java/org/eclipse/aether/named/ipc/IpcServer.java
@@ -497,9 +497,7 @@ public class IpcServer {
                     .map(k -> IpcServer.this.locks.computeIfAbsent(k, 
Lock::new))
                     .forEach(l -> {
                         l.unlock(this);
-                        if (l.isEmpty()) {
-                            IpcServer.this.locks.remove(l.key, l);
-                        }
+                        IpcServer.this.locks.compute(l.key, (k, v) -> (v == l 
&& v.isEmpty()) ? null : v);
                     });
         }
     }

Reply via email to