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 80e49a7a64e0272ee0c153de366e6767d1951bde Author: Guillaume Nodet <[email protected]> AuthorDate: Sun Jun 7 06:33:16 2026 +0000 Fix WeakInternPool.intern() non-atomic check-then-act F-09: Use map.compute() instead of separate get/put to make the interning operation atomic, preventing duplicate objects from defeating heap deduplication during concurrent descriptor resolution. --- .../aether/internal/impl/collect/DataPool.java | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java index 46c217952..84095e09c 100644 --- a/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java +++ b/maven-resolver-impl/src/main/java/org/eclipse/aether/internal/impl/collect/DataPool.java @@ -564,16 +564,21 @@ public final class DataPool { } @Override + @SuppressWarnings("unchecked") public V intern(K key, V value) { - WeakReference<V> pooledRef = map.get(key); - if (pooledRef != null) { - V pooled = pooledRef.get(); - if (pooled != null) { - return pooled; + Object[] result = new Object[1]; + map.compute(key, (k, existingRef) -> { + if (existingRef != null) { + V pooled = existingRef.get(); + if (pooled != null) { + result[0] = pooled; + return existingRef; + } } - } - map.put(key, new WeakReference<>(value)); - return value; + result[0] = value; + return new WeakReference<>(value); + }); + return (V) result[0]; } } }
