diff options
author | Thomas Watson | 2017-07-27 17:30:07 +0000 |
---|---|---|
committer | Thomas Watson | 2017-08-07 16:16:31 +0000 |
commit | 6f277f0934bccc45c25a54e61545e3b14d910cb4 (patch) | |
tree | d10dcd00e6fb4a4e68f58d25a2c0db8fe4439d02 /bundles/org.eclipse.osgi/container/src/org/eclipse | |
parent | 5ddcdea272ca450a04f93e6d8ce786fb4986bfd8 (diff) | |
download | rt.equinox.framework-6f277f0934bccc45c25a54e61545e3b14d910cb4.tar.gz rt.equinox.framework-6f277f0934bccc45c25a54e61545e3b14d910cb4.tar.xz rt.equinox.framework-6f277f0934bccc45c25a54e61545e3b14d910cb4.zip |
Bug 520281 - NPE possible if null values are used to match against aI20170807-2000
filter
Change-Id: I5b4e2b75863500a91d5e278481619254addffbd6
Signed-off-by: Thomas Watson <tjwatson@us.ibm.com>
Diffstat (limited to 'bundles/org.eclipse.osgi/container/src/org/eclipse')
2 files changed, 29 insertions, 26 deletions
diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/util/CaseInsensitiveDictionaryMap.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/util/CaseInsensitiveDictionaryMap.java index 545cc9008..a4700be3e 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/util/CaseInsensitiveDictionaryMap.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/framework/util/CaseInsensitiveDictionaryMap.java @@ -59,8 +59,15 @@ public class CaseInsensitiveDictionaryMap<K, V> extends Dictionary<K, V> impleme Enumeration<? extends K> keys = dictionary.keys(); while (keys.hasMoreElements()) { K key = keys.nextElement(); - if (put(key, dictionary.get(key)) != null) { - throw new IllegalArgumentException(NLS.bind(Msg.HEADER_DUPLICATE_KEY_EXCEPTION, key)); + // ignore null keys + if (key != null) { + V value = dictionary.get(key); + // ignore null values + if (value != null) { + if (put(key, value) != null) { + throw new IllegalArgumentException(NLS.bind(Msg.HEADER_DUPLICATE_KEY_EXCEPTION, key)); + } + } } } } @@ -76,8 +83,16 @@ public class CaseInsensitiveDictionaryMap<K, V> extends Dictionary<K, V> impleme this(initialCapacity(map.size())); /* initialize the keys and values */ for (Entry<? extends K, ? extends V> e : map.entrySet()) { - if (put(e.getKey(), e.getValue()) != null) { - throw new IllegalArgumentException(NLS.bind(Msg.HEADER_DUPLICATE_KEY_EXCEPTION, e.getKey())); + K key = e.getKey(); + // ignore null keys + if (key != null) { + V value = e.getValue(); + // ignore null values + if (value != null) { + if (put(key, value) != null) { + throw new IllegalArgumentException(NLS.bind(Msg.HEADER_DUPLICATE_KEY_EXCEPTION, key)); + } + } } } } @@ -112,13 +127,11 @@ public class CaseInsensitiveDictionaryMap<K, V> extends Dictionary<K, V> impleme /** * {@inheritDoc} * <p> - * The key must be non-null. - * <p> * If the key is a String, the key is located in a case-insensitive manner. */ @Override public V get(Object key) { - return map.get(keyWrap(requireNonNull(key))); + return map.get(keyWrap(key)); } /** @@ -173,13 +186,11 @@ public class CaseInsensitiveDictionaryMap<K, V> extends Dictionary<K, V> impleme /** * {@inheritDoc} * <p> - * The key must be non-null. - * <p> * If the key is a String, the key is removed in a case-insensitive manner. */ @Override public V remove(Object key) { - return map.remove(keyWrap(requireNonNull(key))); + return map.remove(keyWrap(key)); } /** @@ -201,23 +212,19 @@ public class CaseInsensitiveDictionaryMap<K, V> extends Dictionary<K, V> impleme /** * {@inheritDoc} * <p> - * The key must be non-null. - * <p> * If the key is a String, the key is located in a case-insensitive manner. */ @Override public boolean containsKey(Object key) { - return map.containsKey(keyWrap(requireNonNull(key))); + return map.containsKey(keyWrap(key)); } /** * {@inheritDoc} - * <p> - * The value must be non-null. */ @Override public boolean containsValue(Object value) { - return map.containsValue(requireNonNull(value)); + return map.containsValue(value); } private transient Set<Entry<K, V>> entrySet = null; @@ -556,7 +563,7 @@ public class CaseInsensitiveDictionaryMap<K, V> extends Dictionary<K, V> impleme @Override public int hashCode() { - return entry.getKey().hashCode() ^ entry.getValue().hashCode(); + return Objects.hashCode(entry.getKey()) ^ Objects.hashCode(entry.getValue()); } @Override @@ -566,13 +573,7 @@ public class CaseInsensitiveDictionaryMap<K, V> extends Dictionary<K, V> impleme Object k1 = entry.getKey(); @SuppressWarnings("unchecked") Object k2 = (other instanceof CaseInsentiveEntry) ? ((CaseInsentiveEntry<K, V>) other).entry.getKey() : other.getKey(); - if ((k1 == k2) || k1.equals(k2)) { - Object v1 = entry.getValue(); - Object v2 = other.getValue(); - if ((v1 == v2) || v1.equals(v2)) { - return true; - } - } + return Objects.equals(k1, k2) && Objects.equals(entry.getValue(), other.getValue()); } return false; } diff --git a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/serviceregistry/ServiceProperties.java b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/serviceregistry/ServiceProperties.java index b875b6cf3..b6646d431 100644 --- a/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/serviceregistry/ServiceProperties.java +++ b/bundles/org.eclipse.osgi/container/src/org/eclipse/osgi/internal/serviceregistry/ServiceProperties.java @@ -54,7 +54,8 @@ class ServiceProperties extends CaseInsensitiveDictionaryMap<String, Object> { Object key = keysEnum.nextElement(); if (key instanceof String) { String header = (String) key; - if (put(header, cloneValue(props.get(header))) != null) { + Object value = cloneValue(props.get(header)); + if (value != null && put(header, value) != null) { throw new IllegalArgumentException(NLS.bind(Msg.HEADER_DUPLICATE_KEY_EXCEPTION, key)); } } @@ -79,7 +80,8 @@ class ServiceProperties extends CaseInsensitiveDictionaryMap<String, Object> { Object key = e.getKey(); if (key instanceof String) { String header = (String) key; - if (put(header, cloneValue(e.getValue())) != null) { + Object value = cloneValue(props.get(header)); + if (value != null && put(header, value) != null) { throw new IllegalArgumentException(NLS.bind(Msg.HEADER_DUPLICATE_KEY_EXCEPTION, key)); } } |