Michał Pachucki created CXF-7824:
------------------------------------

             Summary: CacheMap may have spurious null keys
                 Key: CXF-7824
                 URL: https://issues.apache.org/jira/browse/CXF-7824
             Project: CXF
          Issue Type: Bug
    Affects Versions: 3.2.6
            Reporter: Michał Pachucki


Hello,

I was debugging a bug in my code and by accident I found a bug in CacheMap.

 

The function updateMainDataMap copies elements from extraKeyMap to mainDataMap 
but does not make sure that keys are not null.

It is possible that entrySet of WeakIdentityHashMap will return null keys.
{code:java}
public Set<Map.Entry<K, V>> entrySet() {
    reap();
    Set<Map.Entry<K, V>> ret = new HashSet<Map.Entry<K, V>>();
    for (Map.Entry<IdentityWeakReference, V> ref : backingStore.entrySet()) {
        final K key = ref.getKey().get(); //possible null here
        final V value = ref.getValue();
        Map.Entry<K, V> entry = new Map.Entry<K, V>() {
            public K getKey() {
                return key;
            }
            public V getValue() {
                return value;
            }
            public V setValue(V value) {
                throw new UnsupportedOperationException();
            }
        };
        ret.add(entry);
    }
    return Collections.unmodifiableSet(ret);
}{code}
On entrance the function clears all null keys (in the reap() functon) and then 
iterates over backingStore. But it is possible that after reap() a key is 
garbage collected and its WeakReference will return null (ref.getKey().get()).

This causes a spurious null key.

 

I gave this case a Major priority because this class is used by 
WSDLManagerImpl, and spurious null keys cause serious problems there. I can 
reproduce this problem in a few minutes of testing. The testcase consists of 
creating generated service over and over again by multiple threads. 
Unfortunately the testcase itself is too big to share.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to