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();
