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 7fa7741a9889d98e7d0ed1e8543ab1796e01b1ad
Author: Guillaume Nodet <[email protected]>
AuthorDate: Sun Jun 7 09:44:41 2026 +0000

    Fix GenericVersionScheme — synchronize computeIfAbsent on versionCache
    
    Collections.synchronizedMap does not make computeIfAbsent atomic;
    the default Map.computeIfAbsent implementation performs a non-atomic
    get-then-put sequence, risking concurrent structural modification of
    the underlying WeakHashMap.
    
    Wrap the computeIfAbsent call in synchronized(versionCache) to use
    the same monitor that synchronizedMap uses internally.
---
 .../org/eclipse/aether/util/version/GenericVersionScheme.java | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersionScheme.java
 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersionScheme.java
index 7188e1966..5a8428f56 100644
--- 
a/maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersionScheme.java
+++ 
b/maven-resolver-util/src/main/java/org/eclipse/aether/util/version/GenericVersionScheme.java
@@ -100,10 +100,13 @@ public class GenericVersionScheme extends 
VersionSchemeSupport {
         GLOBAL_TOTAL_REQUESTS.incrementAndGet();
 
         boolean[] created = {false};
-        GenericVersion result = versionCache.computeIfAbsent(version, v -> {
-            created[0] = true;
-            return new GenericVersion(v);
-        });
+        GenericVersion result;
+        synchronized (versionCache) {
+            result = versionCache.computeIfAbsent(version, v -> {
+                created[0] = true;
+                return new GenericVersion(v);
+            });
+        }
         if (created[0]) {
             cacheMisses.incrementAndGet();
             GLOBAL_CACHE_MISSES.incrementAndGet();

Reply via email to