diff -Nru jackson-databind-2.9.8/debian/changelog jackson-databind-2.9.9.3/debian/changelog --- jackson-databind-2.9.8/debian/changelog 2019-06-21 22:28:48.000000000 +0000 +++ jackson-databind-2.9.9.3/debian/changelog 2019-08-12 22:26:52.000000000 +0000 @@ -1,3 +1,15 @@ +jackson-databind (2.9.9.3-1) unstable; urgency=medium + + * Team upload. + * New upstream version 2.9.9.3. + - Fix CVE-2019-14439 and CVE-2019-14379. Thanks to Salvatore Bonaccorso for + the report. (Closes: #933393) + * Drop all patches. These are all part of the latest upstream release. + * Switch to debhelper-compat = 12. + * Declare compliance with Debian Policy 4.4.0. + + -- Markus Koschany Tue, 13 Aug 2019 00:26:52 +0200 + jackson-databind (2.9.8-3) unstable; urgency=medium * Team upload. diff -Nru jackson-databind-2.9.8/debian/compat jackson-databind-2.9.9.3/debian/compat --- jackson-databind-2.9.8/debian/compat 2019-06-21 22:28:48.000000000 +0000 +++ jackson-databind-2.9.9.3/debian/compat 1970-01-01 00:00:00.000000000 +0000 @@ -1 +0,0 @@ -11 diff -Nru jackson-databind-2.9.8/debian/control jackson-databind-2.9.9.3/debian/control --- jackson-databind-2.9.8/debian/control 2019-06-21 22:28:48.000000000 +0000 +++ jackson-databind-2.9.9.3/debian/control 2019-08-12 22:26:52.000000000 +0000 @@ -5,7 +5,7 @@ Uploaders: Wolodja Wentland Build-Depends: - debhelper (>= 11), + debhelper-compat (= 12), default-jdk, default-jdk-doc, groovy, @@ -23,7 +23,7 @@ libreplacer-java, maven-debian-helper (>= 1.6.5), xmlstarlet -Standards-Version: 4.3.0 +Standards-Version: 4.4.0 Vcs-Git: https://salsa.debian.org/java-team/jackson-databind.git Vcs-Browser: https://salsa.debian.org/java-team/jackson-databind Homepage: http://wiki.fasterxml.com/JacksonHome diff -Nru jackson-databind-2.9.8/debian/patches/base-pom.patch jackson-databind-2.9.9.3/debian/patches/base-pom.patch --- jackson-databind-2.9.8/debian/patches/base-pom.patch 1970-01-01 00:00:00.000000000 +0000 +++ jackson-databind-2.9.9.3/debian/patches/base-pom.patch 2019-08-12 22:26:52.000000000 +0000 @@ -0,0 +1,25 @@ +From: Markus Koschany +Date: Tue, 13 Aug 2019 00:39:57 +0200 +Subject: base pom + +Quick workaround for the FTBFS with jackson-core 2.9.8. Patch must be dropped +when we update jackson-core again. + +Forwarded: not-needed +--- + pom.xml | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/pom.xml b/pom.xml +index b031f65..c6660ac 100644 +--- a/pom.xml ++++ b/pom.xml +@@ -5,7 +5,7 @@ + + com.fasterxml.jackson + jackson-base +- 2.9.9 ++ 2.9.8 + + + com.fasterxml.jackson.core diff -Nru jackson-databind-2.9.8/debian/patches/CVE-2019-12086.patch jackson-databind-2.9.9.3/debian/patches/CVE-2019-12086.patch --- jackson-databind-2.9.8/debian/patches/CVE-2019-12086.patch 2019-06-21 22:28:48.000000000 +0000 +++ jackson-databind-2.9.9.3/debian/patches/CVE-2019-12086.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,25 +0,0 @@ -From: Markus Koschany -Date: Sat, 18 May 2019 20:29:23 +0200 -Subject: CVE-2019-12086 - -Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=929177 -Bug-Upstream: https://github.com/FasterXML/jackson-databind/issues/2326 -Origin: https://github.com/FasterXML/jackson-databind/commit/dda513bd7251b4f32b7b60b1c13740e3b5a43024 ---- - .../com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -index 30adb94..a17cdf5 100644 ---- a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -+++ b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -@@ -80,6 +80,9 @@ public class SubTypeValidator - s.add("org.apache.openjpa.ee.JNDIManagedRuntime"); - s.add("org.apache.axis2.transport.jms.JMSOutTransportInfo"); - -+ // [databind#2326] (2.9.9): one more 3rd party gadget -+ s.add("com.mysql.cj.jdbc.admin.MiniAdmin"); -+ - DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s); - } - diff -Nru jackson-databind-2.9.8/debian/patches/CVE-2019-12384.patch jackson-databind-2.9.9.3/debian/patches/CVE-2019-12384.patch --- jackson-databind-2.9.8/debian/patches/CVE-2019-12384.patch 2019-06-21 22:28:48.000000000 +0000 +++ jackson-databind-2.9.9.3/debian/patches/CVE-2019-12384.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,24 +0,0 @@ -From: Markus Koschany -Date: Sat, 22 Jun 2019 00:00:02 +0200 -Subject: CVE-2019-12384 - -Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=930750 -Origin: https://github.com/FasterXML/jackson-databind/commit/c9ef4a10d6f6633cf470d6a469514b68fa2be234 ---- - .../com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java | 3 +++ - 1 file changed, 3 insertions(+) - -diff --git a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -index a17cdf5..3dbb16e 100644 ---- a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -+++ b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -@@ -83,6 +83,9 @@ public class SubTypeValidator - // [databind#2326] (2.9.9): one more 3rd party gadget - s.add("com.mysql.cj.jdbc.admin.MiniAdmin"); - -+ // [databind#2334] (2.9.9.1): logback-core -+ s.add("ch.qos.logback.core.db.DriverManagerConnectionSource"); -+ - DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s); - } - diff -Nru jackson-databind-2.9.8/debian/patches/CVE-2019-12814.patch jackson-databind-2.9.9.3/debian/patches/CVE-2019-12814.patch --- jackson-databind-2.9.8/debian/patches/CVE-2019-12814.patch 2019-06-21 22:28:48.000000000 +0000 +++ jackson-databind-2.9.9.3/debian/patches/CVE-2019-12814.patch 1970-01-01 00:00:00.000000000 +0000 @@ -1,29 +0,0 @@ -From: Markus Koschany -Date: Sat, 22 Jun 2019 00:26:32 +0200 -Subject: CVE-2019-12814 - -Bug-Debian: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=930750 -Origin: https://github.com/FasterXML/jackson-databind/commit/5f7c69bba07a7155adde130d9dee2e54a54f1fa5 ---- - .../fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java | 6 +++++- - 1 file changed, 5 insertions(+), 1 deletion(-) - -diff --git a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -index 3dbb16e..72db61d 100644 ---- a/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -+++ b/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java -@@ -83,9 +83,13 @@ public class SubTypeValidator - // [databind#2326] (2.9.9): one more 3rd party gadget - s.add("com.mysql.cj.jdbc.admin.MiniAdmin"); - -- // [databind#2334] (2.9.9.1): logback-core -+ // [databind#2334]: logback-core - s.add("ch.qos.logback.core.db.DriverManagerConnectionSource"); - -+ // [databind#2341]: jdom/jdom2 -+ s.add("org.jdom.transform.XSLTransformer"); -+ s.add("org.jdom2.transform.XSLTransformer"); -+ - DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s); - } - diff -Nru jackson-databind-2.9.8/debian/patches/series jackson-databind-2.9.9.3/debian/patches/series --- jackson-databind-2.9.8/debian/patches/series 2019-06-21 22:28:48.000000000 +0000 +++ jackson-databind-2.9.9.3/debian/patches/series 2019-08-12 22:26:52.000000000 +0000 @@ -1,3 +1 @@ -CVE-2019-12086.patch -CVE-2019-12384.patch -CVE-2019-12814.patch +base-pom.patch diff -Nru jackson-databind-2.9.8/pom.xml jackson-databind-2.9.9.3/pom.xml --- jackson-databind-2.9.8/pom.xml 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/pom.xml 2019-08-06 01:40:09.000000000 +0000 @@ -5,12 +5,12 @@ com.fasterxml.jackson jackson-base - 2.9.8 + 2.9.9 com.fasterxml.jackson.core jackson-databind - 2.9.8 + 2.9.9.3 jackson-databind bundle General data-binding functionality for Jackson: works on core streaming API @@ -21,7 +21,7 @@ scm:git:git@github.com:FasterXML/jackson-databind.git scm:git:git@github.com:FasterXML/jackson-databind.git http://github.com/FasterXML/jackson-databind - jackson-databind-2.9.8 + jackson-databind-2.9.9.3 @@ -36,7 +36,10 @@ com.fasterxml.jackson.databind.*;version=${project.version} - + + org.w3c.dom.bootstrap;resolution:=optional, + * + com/fasterxml/jackson/databind/cfg diff -Nru jackson-databind-2.9.8/release-notes/CREDITS-2.x jackson-databind-2.9.9.3/release-notes/CREDITS-2.x --- jackson-databind-2.9.8/release-notes/CREDITS-2.x 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/release-notes/CREDITS-2.x 2019-08-06 01:40:09.000000000 +0000 @@ -504,6 +504,10 @@ * Reported #1501: `ArrayIndexOutOfBoundsException` on non-static inner class constructor (2.7.9) +xiexq (xiexq@knownsec.com) + * Reported #2389: Block one more gadget type (CVE-2019-14361) + (2.7.9.6) + Artur Jonkisz (ajonkisz@github) * Reported #960: `@JsonCreator` not working on a factory with no arguments for ae enum type (2.8.0) @@ -819,7 +823,39 @@ * Requested #2181: Don't re-use dynamic serializers for property-updating copy constructors (2.9.8) +Thomas Krieger (ThomasKrieger@github) + * Reported #1408: Call to `TypeVariable.getBounds()` without synchronization unsafe on + some platforms + (2.9.9) + René Kschamer (flawi@github) * Reported #2197: Illegal reflective access operation warning when using `java.lang.Void` as value type (2.9.8) + +Joffrey Bion (joffrey-bion@github) + * Reported #2265: Inconsistent handling of Collections$UnmodifiableList vs + Collections$UnmodifiableRandomAccessList + (2.9.9) + +Christoph (cfiehe@github.com) + * Contributed #2299: Fix for using jackson-databind in an OSGi environment under Android + (2.9.9) + +Cyril Martin (mcoolive@github.com) + * Reported #2303: Deserialize null, when java type is "TypeRef of TypeRef of T", + does not provide "Type(Type(null))" + (2.9.9) + +Daniil Barvitsky (dbarvitsky@github) + * Reported #2324: `StringCollectionDeserializer` fails with custom collection + (2.9.9) + +Edgar Asatryan (nstdio@github) + * Reported #2374: `ObjectMapper. getRegisteredModuleIds()` throws NPE if no modules registered + (2.9.9.1) + +Michael Simons (michael-simons@github) + * Reported #2395: `NullPointerException` from `ResolvedRecursiveType` (regression due to + fix for #2331) + (2.9.9.3) diff -Nru jackson-databind-2.9.8/release-notes/VERSION-2.x jackson-databind-2.9.9.3/release-notes/VERSION-2.x --- jackson-databind-2.9.8/release-notes/VERSION-2.x 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/release-notes/VERSION-2.x 2019-08-06 01:40:09.000000000 +0000 @@ -4,6 +4,46 @@ === Releases === ------------------------------------------------------------------------ +2.9.9.3 (06-Aug-2019) + +#2395: `NullPointerException` from `ResolvedRecursiveType` (regression due to fix for #2331) + (reported by Michael S) + +2.9.9.2 (27-Jul-2019) + +#2331: `JsonMappingException` through nested getter with generic wildcard return type +#2387: Block yet another deserialization gadget (CVE-2019-14379) +#2389: Block yet another deserialization gadget (CVE-2019-14439) + (reported by xiexq) + +2.9.9.1 (03-Jul-2019) + +#2334: Block one more gadget type (CVE-2019-12384) +#2341: Block one more gadget type (CVE-2019-12814) +#2374: `ObjectMapper. getRegisteredModuleIds()` throws NPE if no modules registered + (reported by Edgar A) + +2.9.9 (16-May-2019) + +#1408: Call to `TypeVariable.getBounds()` without synchronization unsafe on some platforms + (reported by Thomas K) +#2221: `DeserializationProblemHandler.handleUnknownTypeId()` returning `Void.class`, + enableDefaultTyping causing NPE + (reported by MeyerNils@github) +#2251: Getter that returns an abstract collection breaks a delegating `@JsonCreator` +#2265: Inconsistent handling of Collections$UnmodifiableList vs Collections$UnmodifiableRandomAccessList + (reported by Joffrey B) +#2299: Fix for using jackson-databind in an OSGi environment under Android + (contributed by Christoph F) +#2303: Deserialize null, when java type is "TypeRef of TypeRef of T", does not provide "Type(Type(null))" + (reported by Cyril M) +#2324: `StringCollectionDeserializer` fails with custom collection + (reported byb Daniil B) +#2326: Block one more gadget type (CVE-2019-12086) +<<<<<<< HEAD:release-notes/VERSION-2.x +- Prevent String coercion of `null` in `WritableObjectId` when calling `JsonGenerator.writeObjectId()`, + mostly relevant for formats like YAML that have native Object Ids + 2.9.8 (15-Dec-2018) #1662: `ByteBuffer` serialization is broken if offset is not 0 @@ -314,6 +354,19 @@ `MapperFeature.ALLOW_COERCION_OF_SCALARS` (requested by magdel@github) +2.8.11.4 (25-Jul-2019) + +#2334: Block one more gadget type (CVE-2019-12384) +#2341: Block one more gadget type (CVE-2019-12814) +#2387: Block one more gadget type (CVE-2019-14379) +#2389: Block one more gadget type (CVE-2019-14439) + (reported by xiexq) + +2.8.11.3 (23-Nov-2018) + +#2326: Block one more gadget type (CVE-2019-12086) + (contributed by MaximilianTews@github) + 2.8.11.2 (08-Jun-2018) #1941: `TypeFactory.constructFromCanonical()` throws NPE for Unparameterized @@ -549,10 +602,16 @@ #1277: Add caching of resolved generic types for `TypeFactory` (requested by Andriy P) -2.7.10 (not yet released) +2.7.9.5 (23-Nov-2018) -#1628: Don't print to error stream about failure to load JDK 7 types - (reported by Villane@github) +#2097: Block more classes from polymorphic deserialization (CVE-2018-14718 + - CVE-2018-14721) + (reported by Guixiong Wu) +#2109: Canonical string for reference type is built incorrectly + (reported by svarzee@github) +#2186: Block more classes from polymorphic deserialization (CVE-2018-19360, + CVE-2018-19361, CVE-2018-19362) + (reported by Guixiong Wu) 2.7.9 (04-Feb-2017) diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/BasicDeserializerFactory.java 2019-08-06 01:40:09.000000000 +0000 @@ -61,7 +61,10 @@ final static HashMap> _mapFallbacks = new HashMap>(); static { - _mapFallbacks.put(Map.class.getName(), LinkedHashMap.class); + @SuppressWarnings("rawtypes") + final Class DEFAULT_MAP = LinkedHashMap.class; + _mapFallbacks.put(Map.class.getName(), DEFAULT_MAP); + _mapFallbacks.put(AbstractMap.class.getName(), DEFAULT_MAP); _mapFallbacks.put(ConcurrentMap.class.getName(), ConcurrentHashMap.class); _mapFallbacks.put(SortedMap.class.getName(), TreeMap.class); @@ -78,12 +81,21 @@ final static HashMap> _collectionFallbacks = new HashMap>(); static { - _collectionFallbacks.put(Collection.class.getName(), ArrayList.class); - _collectionFallbacks.put(List.class.getName(), ArrayList.class); - _collectionFallbacks.put(Set.class.getName(), HashSet.class); + @SuppressWarnings("rawtypes") + final Class DEFAULT_LIST = ArrayList.class; + @SuppressWarnings("rawtypes") + final Class DEFAULT_SET = HashSet.class; + + _collectionFallbacks.put(Collection.class.getName(), DEFAULT_LIST); + _collectionFallbacks.put(List.class.getName(), DEFAULT_LIST); + _collectionFallbacks.put(Set.class.getName(), DEFAULT_SET); _collectionFallbacks.put(SortedSet.class.getName(), TreeSet.class); _collectionFallbacks.put(Queue.class.getName(), LinkedList.class); + // 09-Feb-2019, tatu: How did we miss these? Related in [databind#2251] problem + _collectionFallbacks.put(AbstractList.class.getName(), DEFAULT_LIST); + _collectionFallbacks.put(AbstractSet.class.getName(), DEFAULT_SET); + // then JDK 1.6 types: /* 17-May-2013, tatu: [databind#216] Should be fine to use straight Class references EXCEPT * that some god-forsaken platforms (... looking at you, Android) do not diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/CreatorProperty.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/CreatorProperty.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/CreatorProperty.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/CreatorProperty.java 2019-08-06 01:40:09.000000000 +0000 @@ -131,7 +131,9 @@ if (_valueDeserializer == deser) { return this; } - return new CreatorProperty(this, deser, _nullProvider); + // 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were + NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider; + return new CreatorProperty(this, deser, nvp); } @Override diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/FieldProperty.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/FieldProperty.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/FieldProperty.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/FieldProperty.java 2019-08-06 01:40:09.000000000 +0000 @@ -89,7 +89,9 @@ if (_valueDeserializer == deser) { return this; } - return new FieldProperty(this, deser, _nullProvider); + // 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were + NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider; + return new FieldProperty(this, deser, nvp); } @Override diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/JavaUtilCollectionsDeserializers.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/JavaUtilCollectionsDeserializers.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/JavaUtilCollectionsDeserializers.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/JavaUtilCollectionsDeserializers.java 2019-08-06 01:40:09.000000000 +0000 @@ -40,6 +40,11 @@ private final static Class CLASS_UNMODIFIABLE_SET; private final static Class CLASS_UNMODIFIABLE_LIST; + + /* 02-Mar-2019, tatu: for [databind#2265], need to consider possible alternate type... + * which we essentially coerce into the other one + */ + private final static Class CLASS_UNMODIFIABLE_LIST_ALIAS; private final static Class CLASS_UNMODIFIABLE_MAP; static { @@ -50,7 +55,9 @@ List list = Collections.singletonList(Boolean.TRUE); CLASS_SINGLETON_LIST = list.getClass(); CLASS_UNMODIFIABLE_LIST = Collections.unmodifiableList(list).getClass(); - + // for [databind#2265] + CLASS_UNMODIFIABLE_LIST_ALIAS = Collections.unmodifiableList(new LinkedList()).getClass(); + Map map = Collections.singletonMap("a", "b"); CLASS_SINGLETON_MAP = map.getClass(); CLASS_UNMODIFIABLE_MAP = Collections.unmodifiableMap(map).getClass(); @@ -69,7 +76,8 @@ conv = converter(TYPE_SINGLETON_LIST, type, List.class); } else if (type.hasRawClass(CLASS_SINGLETON_SET)) { conv = converter(TYPE_SINGLETON_SET, type, Set.class); - } else if (type.hasRawClass(CLASS_UNMODIFIABLE_LIST)) { + // [databind#2265]: we may have another impl type for unmodifiable Lists, check both + } else if (type.hasRawClass(CLASS_UNMODIFIABLE_LIST) || type.hasRawClass(CLASS_UNMODIFIABLE_LIST_ALIAS)) { conv = converter(TYPE_UNMODIFIABLE_LIST, type, List.class); } else if (type.hasRawClass(CLASS_UNMODIFIABLE_SET)) { conv = converter(TYPE_UNMODIFIABLE_SET, type, Set.class); diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/MethodProperty.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/MethodProperty.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/MethodProperty.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/MethodProperty.java 2019-08-06 01:40:09.000000000 +0000 @@ -80,7 +80,9 @@ if (_valueDeserializer == deser) { return this; } - return new MethodProperty(this, deser, _nullProvider); + // 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were + NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider; + return new MethodProperty(this, deser, nvp); } @Override diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdReferenceProperty.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdReferenceProperty.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdReferenceProperty.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdReferenceProperty.java 2019-08-06 01:40:09.000000000 +0000 @@ -50,7 +50,9 @@ if (_valueDeserializer == deser) { return this; } - return new ObjectIdReferenceProperty(this, deser, _nullProvider); + // 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were + NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider; + return new ObjectIdReferenceProperty(this, deser, nvp); } @Override diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdValueProperty.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdValueProperty.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdValueProperty.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/ObjectIdValueProperty.java 2019-08-06 01:40:09.000000000 +0000 @@ -51,7 +51,9 @@ if (_valueDeserializer == deser) { return this; } - return new ObjectIdValueProperty(this, deser, _nullProvider); + // 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were + NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider; + return new ObjectIdValueProperty(this, deser, nvp); } @Override diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/SetterlessProperty.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/SetterlessProperty.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/impl/SetterlessProperty.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/impl/SetterlessProperty.java 2019-08-06 01:40:09.000000000 +0000 @@ -64,7 +64,9 @@ if (_valueDeserializer == deser) { return this; } - return new SetterlessProperty(this, deser, _nullProvider); + // 07-May-2019, tatu: As per [databind#2303], must keep VD/NVP in-sync if they were + NullValueProvider nvp = (_valueDeserializer == _nullProvider) ? deser : _nullProvider; + return new SetterlessProperty(this, deser, nvp); } @Override diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/std/AtomicReferenceDeserializer.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/std/AtomicReferenceDeserializer.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/std/AtomicReferenceDeserializer.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/std/AtomicReferenceDeserializer.java 2019-08-06 01:40:09.000000000 +0000 @@ -37,9 +37,10 @@ return new AtomicReferenceDeserializer(_fullType, _valueInstantiator, typeDeser, valueDeser); } + @Override - public AtomicReference getNullValue(DeserializationContext ctxt) { - return new AtomicReference(); + public AtomicReference getNullValue(DeserializationContext ctxt) throws JsonMappingException { + return new AtomicReference(_valueDeserializer.getNullValue(ctxt)); } @Override diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/std/ReferenceTypeDeserializer.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/std/ReferenceTypeDeserializer.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/std/ReferenceTypeDeserializer.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/std/ReferenceTypeDeserializer.java 2019-08-06 01:40:09.000000000 +0000 @@ -118,10 +118,10 @@ JsonDeserializer valueDeser); @Override - public abstract T getNullValue(DeserializationContext ctxt); + public abstract T getNullValue(DeserializationContext ctxt) throws JsonMappingException; @Override - public Object getEmptyValue(DeserializationContext ctxt) { + public Object getEmptyValue(DeserializationContext ctxt) throws JsonMappingException { return getNullValue(ctxt); } diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/deser/std/StringCollectionDeserializer.java 2019-08-06 01:40:09.000000000 +0000 @@ -103,8 +103,12 @@ // May need to resolve types for delegate-based creators: JsonDeserializer delegate = null; if (_valueInstantiator != null) { - AnnotatedWithParams delegateCreator = _valueInstantiator.getDelegateCreator(); + // [databind#2324]: check both array-delegating and delegating + AnnotatedWithParams delegateCreator = _valueInstantiator.getArrayDelegateCreator(); if (delegateCreator != null) { + JavaType delegateType = _valueInstantiator.getArrayDelegateType(ctxt.getConfig()); + delegate = findDeserializer(ctxt, delegateType, property); + } else if ((delegateCreator = _valueInstantiator.getDelegateCreator()) != null) { JavaType delegateType = _valueInstantiator.getDelegateType(ctxt.getConfig()); delegate = findDeserializer(ctxt, delegateType, property); } diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/SubTypeValidator.java 2019-08-06 01:40:09.000000000 +0000 @@ -80,6 +80,22 @@ s.add("org.apache.openjpa.ee.JNDIManagedRuntime"); s.add("org.apache.axis2.transport.jms.JMSOutTransportInfo"); + // [databind#2326] (2.9.9) + s.add("com.mysql.cj.jdbc.admin.MiniAdmin"); + + // [databind#2334]: logback-core (2.9.9.1) + s.add("ch.qos.logback.core.db.DriverManagerConnectionSource"); + + // [databind#2341]: jdom/jdom2 (2.9.9.1) + s.add("org.jdom.transform.XSLTransformer"); + s.add("org.jdom2.transform.XSLTransformer"); + + // [databind#2387]: EHCache + s.add("net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup"); + + // [databind#2389]: logback/jndi + s.add("ch.qos.logback.core.db.JNDIConnectionSource"); + DEFAULT_NO_DESER_CLASS_NAMES = Collections.unmodifiableSet(s); } diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeDeserializerBase.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeDeserializerBase.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeDeserializerBase.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/jsontype/impl/TypeDeserializerBase.java 2019-08-06 01:40:09.000000000 +0000 @@ -161,8 +161,8 @@ // 10-May-2016, tatu: We may get some help... JavaType actual = _handleUnknownTypeId(ctxt, typeId); if (actual == null) { // what should this be taken to mean? - // TODO: try to figure out something better - return null; + // 17-Jan-2019, tatu: As per [databind#2221], better NOT return `null` but... + return NullifyingDeserializer.instance; } // ... would this actually work? deser = ctxt.findContextualValueDeserializer(actual, _property); diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/jsontype/TypeSerializer.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/jsontype/TypeSerializer.java --- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/jsontype/TypeSerializer.java 2018-12-15 21:58:28.000000000 +0000 +++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/jsontype/TypeSerializer.java 2019-08-06 01:40:09.000000000 +0000 @@ -138,7 +138,7 @@ /** * Method that should be called after {@link #writeTypePrefix(JsonGenerator, WritableTypeId)} - * and matching value write have called, passing {@link WritableTypeId} returned. + * and matching value write have been called, passing {@link WritableTypeId} returned. * Usual idiom is: *
      * // Indicator generator that type identifier may be needed; generator may write
diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java
--- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/ObjectMapper.java	2019-08-06 01:40:09.000000000 +0000
@@ -962,7 +962,8 @@
      */
     public Set getRegisteredModuleIds()
     {
-        return Collections.unmodifiableSet(_registeredModuleTypes);
+        return (_registeredModuleTypes == null) ?
+                Collections.emptySet() : Collections.unmodifiableSet(_registeredModuleTypes);
     }
 
     /**
diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/ser/impl/WritableObjectId.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/ser/impl/WritableObjectId.java
--- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/ser/impl/WritableObjectId.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/ser/impl/WritableObjectId.java	2019-08-06 01:40:09.000000000 +0000
@@ -64,12 +64,17 @@
         // 03-Aug-2013, tatu: Prefer Native Object Ids if available
         if (gen.canWriteObjectId()) {
             // Need to assume String(ified) ids, for now... could add 'long' variant?
-            gen.writeObjectId(String.valueOf(id));
+            // 05-Feb-2019, tatu: But in special case of `null` we should not coerce -- whether
+            //   we should even call is an open question, but for now do pass to let generator
+            //   decide what to do, if anything.
+            String idStr = (id == null) ? null : String.valueOf(id);
+            gen.writeObjectId(idStr);
             return;
         }
-        
+
         SerializableString name = w.propertyName;
         if (name != null) {
+            // 05-Feb-2019, tatu: How about `null` id? For now, write
             gen.writeFieldName(name);
             w.serializer.serialize(id, gen, provider);
         }
diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/type/ResolvedRecursiveType.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/type/ResolvedRecursiveType.java
--- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/type/ResolvedRecursiveType.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/type/ResolvedRecursiveType.java	2019-08-06 01:40:09.000000000 +0000
@@ -36,14 +36,29 @@
 
     public JavaType getSelfReferencedType() { return _referencedType; }
 
+    // 23-Jul-2019, tatu: [databind#2331] Need to also delegate this...
+    @Override
+    public TypeBindings getBindings() {
+        if (_referencedType != null) { // `null` before resolution [databind#2395]
+            return _referencedType.getBindings();
+        }
+        return super.getBindings();
+    }
+
     @Override
     public StringBuilder getGenericSignature(StringBuilder sb) {
-        return _referencedType.getGenericSignature(sb);
+        if (_referencedType != null) {
+            return _referencedType.getGenericSignature(sb);
+        }
+        return sb.append("?");
     }
 
     @Override
     public StringBuilder getErasedSignature(StringBuilder sb) {
-        return _referencedType.getErasedSignature(sb);
+        if (_referencedType != null) {
+            return _referencedType.getErasedSignature(sb);
+        }
+        return sb;
     }
 
     @Override
diff -Nru jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java
--- jackson-databind-2.9.8/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/main/java/com/fasterxml/jackson/databind/type/TypeFactory.java	2019-08-06 01:40:09.000000000 +0000
@@ -182,7 +182,11 @@
             typeCache = null;
         } else if (_modifiers == null) {
             mods = new TypeModifier[] { mod };
+            // 29-Jul-2019, tatu: Actually I think we better clear cache in this case
+            //    as well to ensure no leakage occurs (see [databind#2395])
+            typeCache = null;
         } else {
+            // but may keep existing cache otherwise
             mods = ArrayBuilders.insertInListNoDup(_modifiers, mod);
         }
         return new TypeFactory(typeCache, _parser, mods, _classLoader);
@@ -1236,9 +1240,8 @@
             // sanity check
             throw new IllegalArgumentException("Unrecognized Type: "+((type == null) ? "[null]" : type.toString()));
         }
-        /* 21-Feb-2016, nateB/tatu: as per [databind#1129] (applied for 2.7.2),
-         *   we do need to let all kinds of types to be refined, esp. for Scala module.
-         */
+        // 21-Feb-2016, nateB/tatu: as per [databind#1129] (applied for 2.7.2),
+        //   we do need to let all kinds of types to be refined, esp. for Scala module.
         if (_modifiers != null) {
             TypeBindings b = resultType.getBindings();
             if (b == null) {
@@ -1466,7 +1469,9 @@
     {
         // ideally should find it via bindings:
         final String name = var.getName();
-if (bindings == null) throw new Error("No Bindings!");
+        if (bindings == null) {
+            throw new IllegalArgumentException("Null `bindings` passed (type variable \""+name+"\")");
+        }
         JavaType type = bindings.findBoundType(name);
         if (type != null) {
             return type;
@@ -1478,7 +1483,18 @@
         }
         bindings = bindings.withUnboundVariable(name);
 
-        Type[] bounds = var.getBounds();
+        final Type[] bounds;
+
+        // 15-Jan-2019, tatu: As weird as this looks, apparently on some platforms (Arm CPU, mobile
+        //    devices), unsynchronized internal access can lead to issues, see:
+        //
+        //  https://vmlens.com/articles/java-lang-reflect-typevariable-getbounds-is-not-thread-safe/  
+        //
+        //    No good way to reproduce but since this should not be on critical path, let's add
+        //    syncing as it seems potentially necessary.
+        synchronized (var) {
+            bounds = var.getBounds();
+        }
         return _fromAny(context, bounds[0], bindings);
     }
 
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/creators/DelegatingArrayCreator2324Test.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/creators/DelegatingArrayCreator2324Test.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/creators/DelegatingArrayCreator2324Test.java	1970-01-01 00:00:00.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/creators/DelegatingArrayCreator2324Test.java	2019-08-06 01:40:09.000000000 +0000
@@ -0,0 +1,70 @@
+package com.fasterxml.jackson.databind.deser.creators;
+
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+
+// for [databind#2324]
+public class DelegatingArrayCreator2324Test extends BaseMapTest
+{
+    @JsonDeserialize(as=ImmutableBag.class)
+    public interface Bag extends Collection { }
+
+    public static class ImmutableBag extends AbstractCollection implements Bag  {
+        @Override
+        public Iterator iterator() { return elements.iterator(); }
+
+        @Override
+        public int size() { return elements.size(); }
+
+        @JsonCreator(mode=JsonCreator.Mode.DELEGATING)
+        private ImmutableBag(Collection elements ) {
+            this.elements = Collections.unmodifiableCollection(elements);
+        }
+
+        private final Collection elements;
+    }
+
+    static class Value {
+        public String value;
+
+        public Value(String v) { value = v; }
+
+        @Override
+        public boolean equals(Object o) {
+            return value.equals(((Value) o).value);
+        }
+    }
+
+    static class WithBagOfStrings {
+        public Bag getStrings() { return this.bagOfStrings; }
+        public void setStrings(Bag bagOfStrings) { this.bagOfStrings = bagOfStrings; }
+        private Bag bagOfStrings;
+    }
+
+    static class WithBagOfValues {
+        public Bag getValues() { return this.bagOfValues; }
+        public void setValues(Bag bagOfValues) { this.bagOfValues = bagOfValues; }
+        private Bag bagOfValues;
+    }    
+
+    private final ObjectMapper MAPPER = objectMapper();
+
+    public void testDeserializeBagOfStrings() throws Exception {
+        WithBagOfStrings result = MAPPER.readerFor(WithBagOfStrings.class)
+                .readValue("{\"strings\": [ \"a\", \"b\", \"c\"]}");
+        assertEquals(3, result.getStrings().size());
+    }
+
+    public void testDeserializeBagOfPOJOs() throws Exception {
+        WithBagOfValues result = MAPPER.readerFor(WithBagOfValues.class)
+                .readValue("{\"values\": [ \"a\", \"b\", \"c\"]}");
+        assertEquals(3, result.getValues().size());
+        assertEquals(new Value("a"),  result.getValues().iterator().next());
+    }
+}
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/filter/ProblemHandlerUnknownTypeId2221Test.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/filter/ProblemHandlerUnknownTypeId2221Test.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/filter/ProblemHandlerUnknownTypeId2221Test.java	1970-01-01 00:00:00.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/filter/ProblemHandlerUnknownTypeId2221Test.java	2019-08-06 01:40:09.000000000 +0000
@@ -0,0 +1,109 @@
+package com.fasterxml.jackson.databind.deser.filter;
+
+import java.io.*;
+import java.util.Collection;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
+import com.fasterxml.jackson.databind.*;
+import com.fasterxml.jackson.databind.deser.DeserializationProblemHandler;
+import com.fasterxml.jackson.databind.jsontype.TypeIdResolver;
+
+// for [databind#2221]
+public class ProblemHandlerUnknownTypeId2221Test extends BaseMapTest
+{
+    @SuppressWarnings("rawtypes")
+    @JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "_class")
+    @JsonInclude(Include.NON_EMPTY)
+    static class GenericContent {
+
+        private Collection innerObjects;
+
+        public Collection getInnerObjects() {
+            return innerObjects;
+        }
+
+        public void setInnerObjects(Collection innerObjects) {
+            this.innerObjects = innerObjects;
+        }
+    }
+
+    static class DummyContent {
+        private String aField;
+
+        public DummyContent() {
+            super();
+        }
+
+        public DummyContent(String aField) {
+            super();
+            this.aField = aField;
+        }
+
+        public String getaField() {
+            return aField;
+        }
+
+        public void setaField(String aField) {
+            this.aField = aField;
+        }
+
+        @Override
+        public String toString() {
+            return "DummyContent [aField=" + aField + "]";
+        }
+    }
+
+    private final static String CLASS_GENERIC_CONTENT = GenericContent.class.getName();
+    private final static String CLASS_DUMMY_CONTENT = DummyContent.class.getName();
+    private final static String JSON = aposToQuotes(
+"{\n" +
+"          \"_class\":\""+CLASS_GENERIC_CONTENT+"\",\n" +
+"          \"innerObjects\":\n" +
+"               [\n" +
+"                    \"java.util.ArrayList\",\n" +
+"                    [\n" +
+"                         [\n" +
+"                              \""+CLASS_DUMMY_CONTENT+"\",\n" +
+"                              {\n" +
+"                                   \"aField\":\"some value\"\n" +
+"                              }\n" +
+"                         ],\n" +
+"                         [\n" +
+"                              \"com.fasterxml.jackson.databind.deser.NoSuchClass$AnInventedClassBeingNotOnTheClasspath\",\n" +
+"                              {\n" +
+"                                   \"aField\":\"some value\"\n" +
+"                              }\n" +
+"                         ]\n" +
+"                    ]\n" +
+"               ]\n" +
+"     }"
+);
+
+    public void testWithDeserializationProblemHandler() throws Exception {
+        final ObjectMapper mapper = new ObjectMapper()
+                .enableDefaultTyping();
+        mapper.addHandler(new DeserializationProblemHandler() {
+            @Override
+            public JavaType handleUnknownTypeId(DeserializationContext ctxt, JavaType baseType, String subTypeId, TypeIdResolver idResolver, String failureMsg) throws IOException {
+//                System.out.println("Print out a warning here");
+                return ctxt.constructType(Void.class);
+            }
+        });
+        GenericContent processableContent = mapper.readValue(JSON, GenericContent.class);
+        assertNotNull(processableContent.getInnerObjects());
+        assertEquals(2, processableContent.getInnerObjects().size());
+    }
+
+    public void testWithDisabledFAIL_ON_INVALID_SUBTYPE() throws Exception {
+        final ObjectMapper mapper = new ObjectMapper()
+                .disable(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE)
+                .enableDefaultTyping()
+        ;
+        GenericContent processableContent = mapper.readValue(JSON, GenericContent.class);
+        assertNotNull(processableContent.getInnerObjects());
+        assertEquals(2, processableContent.getInnerObjects().size());
+    }
+}
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/CollectionDeserTest.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/CollectionDeserTest.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/CollectionDeserTest.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/CollectionDeserTest.java	2019-08-06 01:40:09.000000000 +0000
@@ -47,6 +47,15 @@
         public Iterable values;
     }
 
+    // [databind#2251]
+    static class ListAsAbstract {
+        public AbstractList values;
+    }
+
+    static class SetAsAbstract {
+        public AbstractSet values;
+    }
+
     static class ListAsIterableX {
         public Iterable nums;
     }
@@ -284,4 +293,18 @@
             assertEquals("I want to catch this exception", exc.getMessage());
         }
     }
+
+    // [databind#2251]
+    public void testAbstractListAndSet() throws Exception
+    {
+        final String JSON = "{\"values\":[\"foo\", \"bar\"]}";
+
+        ListAsAbstract list = MAPPER.readValue(JSON, ListAsAbstract.class);
+        assertEquals(2, list.values.size());
+        assertEquals(ArrayList.class, list.values.getClass());
+
+        SetAsAbstract set = MAPPER.readValue(JSON, SetAsAbstract.class);
+        assertEquals(2, set.values.size());
+        assertEquals(HashSet.class, set.values.getClass());
+    }
 }
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesDeserTest.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesDeserTest.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesDeserTest.java	1970-01-01 00:00:00.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesDeserTest.java	2019-08-06 01:40:09.000000000 +0000
@@ -0,0 +1,301 @@
+package com.fasterxml.jackson.databind.deser.jdk;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.concurrent.atomic.*;
+
+import com.fasterxml.jackson.annotation.*;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.ObjectReader;
+import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
+import com.fasterxml.jackson.databind.annotation.JsonSerialize;
+
+public class JDKAtomicTypesDeserTest
+    extends com.fasterxml.jackson.databind.BaseMapTest
+{
+    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
+    @JsonSubTypes({ @JsonSubTypes.Type(Impl.class) })
+    static abstract class Base { }
+
+    @JsonTypeName("I")
+    static class Impl extends Base {
+        public int value;
+
+        public Impl() { }
+        public Impl(int v) { value = v; }
+    }
+
+    static class RefWrapper
+    {
+        public AtomicReference w;
+
+        public RefWrapper() { }
+        public RefWrapper(Base b) {
+            w = new AtomicReference(b);
+        }
+        public RefWrapper(int i) {
+            w = new AtomicReference(new Impl(i));
+        }
+    }
+
+    static class SimpleWrapper {
+        public AtomicReference value;
+
+        public SimpleWrapper(Object o) { value = new AtomicReference(o); }
+    }
+
+    static class RefiningWrapper {
+        @JsonDeserialize(contentAs=BigDecimal.class)
+        public AtomicReference value;
+    }
+
+    // Additional tests for improvements with [databind#932]
+
+    static class UnwrappingRefParent {
+        @JsonUnwrapped(prefix = "XX.")
+        public AtomicReference child = new AtomicReference(new Child());
+    }
+
+    static class Child {
+        public String name = "Bob";
+    }
+
+    static class Parent {
+        private Child child = new Child();
+
+        @JsonUnwrapped
+        public Child getChild() {
+             return child;
+        }
+    }
+
+    static class WrappedString {
+        String value;
+
+        public WrappedString(String s) { value = s; }
+    }
+
+    static class AtomicRefReadWrapper {
+        @JsonDeserialize(contentAs=WrappedString.class)
+        public AtomicReference value;
+    }
+
+    static class LCStringWrapper {
+        @JsonDeserialize(contentUsing=LowerCasingDeserializer.class)
+        public AtomicReference value;
+
+        public LCStringWrapper() { }
+    }
+
+    @JsonPropertyOrder({ "a", "b" })
+    static class Issue1256Bean {
+        @JsonSerialize(as=AtomicReference.class)
+        public Object a = new AtomicReference();
+        public AtomicReference b = new AtomicReference();
+    }
+
+    // [databind#2303]
+    static class MyBean2303 {
+        public AtomicReference> refRef;
+    }    
+
+    /*
+    /**********************************************************
+    /* Test methods
+    /**********************************************************
+     */
+
+    private final ObjectMapper MAPPER = objectMapper();
+    
+    public void testAtomicBoolean() throws Exception
+    {
+        AtomicBoolean b = MAPPER.readValue("true", AtomicBoolean.class);
+        assertTrue(b.get());
+    }
+
+    public void testAtomicInt() throws Exception
+    {
+        AtomicInteger value = MAPPER.readValue("13", AtomicInteger.class);
+        assertEquals(13, value.get());
+    }
+
+    public void testAtomicLong() throws Exception
+    {
+        AtomicLong value = MAPPER.readValue("12345678901", AtomicLong.class);
+        assertEquals(12345678901L, value.get());
+    }
+
+    public void testAtomicReference() throws Exception
+    {
+        AtomicReference value = MAPPER.readValue("[1,2]",
+                new com.fasterxml.jackson.core.type.TypeReference>() { });
+        Object ob = value.get();
+        assertNotNull(ob);
+        assertEquals(long[].class, ob.getClass());
+        long[] longs = (long[]) ob;
+        assertNotNull(longs);
+        assertEquals(2, longs.length);
+        assertEquals(1, longs[0]);
+        assertEquals(2, longs[1]);
+    }
+
+    // for [databind#811]
+    public void testAbsentExclusion() throws Exception
+    {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
+        assertEquals(aposToQuotes("{'value':true}"),
+                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
+        assertEquals(aposToQuotes("{}"),
+                mapper.writeValueAsString(new SimpleWrapper(null)));
+    }
+
+    public void testSerPropInclusionAlways() throws Exception
+    {
+        JsonInclude.Value incl =
+                JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, JsonInclude.Include.ALWAYS);
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setDefaultPropertyInclusion(incl);
+        assertEquals(aposToQuotes("{'value':true}"),
+                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
+    }
+
+    public void testSerPropInclusionNonNull() throws Exception
+    {
+        JsonInclude.Value incl =
+                JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, JsonInclude.Include.NON_NULL);
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setDefaultPropertyInclusion(incl);
+        assertEquals(aposToQuotes("{'value':true}"),
+                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
+    }
+
+    public void testSerPropInclusionNonAbsent() throws Exception
+    {
+        JsonInclude.Value incl =
+                JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, JsonInclude.Include.NON_ABSENT);
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setDefaultPropertyInclusion(incl);
+        assertEquals(aposToQuotes("{'value':true}"),
+                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
+    }
+
+    public void testSerPropInclusionNonEmpty() throws Exception
+    {
+        JsonInclude.Value incl =
+                JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, JsonInclude.Include.NON_EMPTY);
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setDefaultPropertyInclusion(incl);
+        assertEquals(aposToQuotes("{'value':true}"),
+                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
+    }
+
+    // [databind#340]
+    public void testPolymorphicAtomicReference() throws Exception
+    {
+        RefWrapper input = new RefWrapper(13);
+        String json = MAPPER.writeValueAsString(input);
+        
+        RefWrapper result = MAPPER.readValue(json, RefWrapper.class);
+        assertNotNull(result.w);
+        Object ob = result.w.get();
+        assertEquals(Impl.class, ob.getClass());
+        assertEquals(13, ((Impl) ob).value);
+    }
+
+    // [databind#740]
+    public void testFilteringOfAtomicReference() throws Exception
+    {
+        SimpleWrapper input = new SimpleWrapper(null);
+        ObjectMapper mapper = MAPPER;
+
+        // by default, include as null
+        assertEquals(aposToQuotes("{'value':null}"), mapper.writeValueAsString(input));
+
+        // ditto with "no nulls"
+        mapper = new ObjectMapper().setSerializationInclusion(JsonInclude
+                .Include.NON_NULL);
+        assertEquals(aposToQuotes("{'value':null}"), mapper.writeValueAsString(input));
+
+        // but not with "non empty"
+        mapper = new ObjectMapper().setSerializationInclusion(JsonInclude
+                .Include.NON_EMPTY);
+        assertEquals("{}", mapper.writeValueAsString(input));
+    }
+
+    public void testTypeRefinement() throws Exception
+    {
+        RefiningWrapper input = new RefiningWrapper();
+        BigDecimal bd = new BigDecimal("0.25");
+        input.value = new AtomicReference(bd);
+        String json = MAPPER.writeValueAsString(input);
+
+        // so far so good. But does it come back as expected?
+        RefiningWrapper result = MAPPER.readValue(json, RefiningWrapper.class);
+        assertNotNull(result.value);
+        Object ob = result.value.get();
+        assertEquals(BigDecimal.class, ob.getClass());
+        assertEquals(bd, ob);
+    }
+
+    // [databind#882]: verify `@JsonDeserialize(contentAs=)` works with AtomicReference
+    public void testDeserializeWithContentAs() throws Exception
+    {
+        AtomicRefReadWrapper result = MAPPER.readValue(aposToQuotes("{'value':'abc'}"),
+                AtomicRefReadWrapper.class);
+         Object v = result.value.get();
+         assertNotNull(v);
+         assertEquals(WrappedString.class, v.getClass());
+         assertEquals("abc", ((WrappedString)v).value);
+    }
+    
+    // [databind#932]: support unwrapping too
+    public void testWithUnwrapping() throws Exception
+    {
+         String jsonExp = aposToQuotes("{'XX.name':'Bob'}");
+         String jsonAct = MAPPER.writeValueAsString(new UnwrappingRefParent());
+         assertEquals(jsonExp, jsonAct);
+    }
+
+    public void testWithCustomDeserializer() throws Exception
+    {
+        LCStringWrapper w = MAPPER.readValue(aposToQuotes("{'value':'FoobaR'}"),
+                LCStringWrapper.class);
+        assertEquals("foobar", w.value.get());
+    }
+
+    public void testEmpty1256() throws Exception
+    {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
+
+        String json = mapper.writeValueAsString(new Issue1256Bean());
+        assertEquals("{}", json);
+    }
+
+    // [databind#1307]
+    @SuppressWarnings("unchecked")
+    public void testNullValueHandling() throws Exception
+    {
+        AtomicReference inputData = new AtomicReference();
+        String json = MAPPER.writeValueAsString(inputData);
+        AtomicReference readData = (AtomicReference) MAPPER.readValue(json, AtomicReference.class);
+        assertNotNull(readData);
+        assertNull(readData.get());
+    }
+
+    // [databind#2303]
+    public void testNullWithinNested() throws Exception
+    {
+        final ObjectReader r = MAPPER.readerFor(MyBean2303.class);
+        MyBean2303 intRef = r.readValue(" {\"refRef\": 2 } ");
+        assertNotNull(intRef.refRef);
+        assertNotNull(intRef.refRef.get());
+        assertEquals(intRef.refRef.get().get(), new Integer(2));
+
+        MyBean2303 nullRef = r.readValue(" {\"refRef\": null } ");
+        assertNotNull(nullRef.refRef);
+        assertNotNull(nullRef.refRef.get());
+        assertNull(nullRef.refRef.get().get());
+    }
+}
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesTest.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesTest.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesTest.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/JDKAtomicTypesTest.java	1970-01-01 00:00:00.000000000 +0000
@@ -1,281 +0,0 @@
-package com.fasterxml.jackson.databind.deser.jdk;
-
-import java.io.Serializable;
-import java.math.BigDecimal;
-import java.util.concurrent.atomic.*;
-
-import com.fasterxml.jackson.annotation.*;
-import com.fasterxml.jackson.databind.ObjectMapper;
-import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
-import com.fasterxml.jackson.databind.annotation.JsonSerialize;
-
-public class JDKAtomicTypesTest
-    extends com.fasterxml.jackson.databind.BaseMapTest
-{
-    @JsonTypeInfo(use = JsonTypeInfo.Id.NAME)
-    @JsonSubTypes({ @JsonSubTypes.Type(Impl.class) })
-    static abstract class Base { }
-
-    @JsonTypeName("I")
-    static class Impl extends Base {
-        public int value;
-
-        public Impl() { }
-        public Impl(int v) { value = v; }
-    }
-
-    static class RefWrapper
-    {
-        public AtomicReference w;
-
-        public RefWrapper() { }
-        public RefWrapper(Base b) {
-            w = new AtomicReference(b);
-        }
-        public RefWrapper(int i) {
-            w = new AtomicReference(new Impl(i));
-        }
-    }
-
-    static class SimpleWrapper {
-        public AtomicReference value;
-
-        public SimpleWrapper(Object o) { value = new AtomicReference(o); }
-    }
-
-    static class RefiningWrapper {
-        @JsonDeserialize(contentAs=BigDecimal.class)
-        public AtomicReference value;
-    }
-
-    // Additional tests for improvements with [databind#932]
-
-    static class UnwrappingRefParent {
-        @JsonUnwrapped(prefix = "XX.")
-        public AtomicReference child = new AtomicReference(new Child());
-    }
-
-    static class Child {
-        public String name = "Bob";
-    }
-
-    static class Parent {
-        private Child child = new Child();
-
-        @JsonUnwrapped
-        public Child getChild() {
-             return child;
-        }
-    }
-
-    static class WrappedString {
-        String value;
-
-        public WrappedString(String s) { value = s; }
-    }
-
-    static class AtomicRefReadWrapper {
-        @JsonDeserialize(contentAs=WrappedString.class)
-        public AtomicReference value;
-    }
-
-    static class LCStringWrapper {
-        @JsonDeserialize(contentUsing=LowerCasingDeserializer.class)
-        public AtomicReference value;
-
-        public LCStringWrapper() { }
-    }
-
-    @JsonPropertyOrder({ "a", "b" })
-    static class Issue1256Bean {
-        @JsonSerialize(as=AtomicReference.class)
-        public Object a = new AtomicReference();
-        public AtomicReference b = new AtomicReference();
-    }
-
-    /*
-    /**********************************************************
-    /* Test methods
-    /**********************************************************
-     */
-
-    private final ObjectMapper MAPPER = objectMapper();
-    
-    public void testAtomicBoolean() throws Exception
-    {
-        AtomicBoolean b = MAPPER.readValue("true", AtomicBoolean.class);
-        assertTrue(b.get());
-    }
-
-    public void testAtomicInt() throws Exception
-    {
-        AtomicInteger value = MAPPER.readValue("13", AtomicInteger.class);
-        assertEquals(13, value.get());
-    }
-
-    public void testAtomicLong() throws Exception
-    {
-        AtomicLong value = MAPPER.readValue("12345678901", AtomicLong.class);
-        assertEquals(12345678901L, value.get());
-    }
-
-    public void testAtomicReference() throws Exception
-    {
-        AtomicReference value = MAPPER.readValue("[1,2]",
-                new com.fasterxml.jackson.core.type.TypeReference>() { });
-        Object ob = value.get();
-        assertNotNull(ob);
-        assertEquals(long[].class, ob.getClass());
-        long[] longs = (long[]) ob;
-        assertNotNull(longs);
-        assertEquals(2, longs.length);
-        assertEquals(1, longs[0]);
-        assertEquals(2, longs[1]);
-    }
-
-    // for [databind#811]
-    public void testAbsentExclusion() throws Exception
-    {
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
-        assertEquals(aposToQuotes("{'value':true}"),
-                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
-        assertEquals(aposToQuotes("{}"),
-                mapper.writeValueAsString(new SimpleWrapper(null)));
-    }
-
-    public void testSerPropInclusionAlways() throws Exception
-    {
-        JsonInclude.Value incl =
-                JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, JsonInclude.Include.ALWAYS);
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.setDefaultPropertyInclusion(incl);
-        assertEquals(aposToQuotes("{'value':true}"),
-                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
-    }
-
-    public void testSerPropInclusionNonNull() throws Exception
-    {
-        JsonInclude.Value incl =
-                JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, JsonInclude.Include.NON_NULL);
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.setDefaultPropertyInclusion(incl);
-        assertEquals(aposToQuotes("{'value':true}"),
-                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
-    }
-
-    public void testSerPropInclusionNonAbsent() throws Exception
-    {
-        JsonInclude.Value incl =
-                JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, JsonInclude.Include.NON_ABSENT);
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.setDefaultPropertyInclusion(incl);
-        assertEquals(aposToQuotes("{'value':true}"),
-                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
-    }
-
-    public void testSerPropInclusionNonEmpty() throws Exception
-    {
-        JsonInclude.Value incl =
-                JsonInclude.Value.construct(JsonInclude.Include.NON_ABSENT, JsonInclude.Include.NON_EMPTY);
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.setDefaultPropertyInclusion(incl);
-        assertEquals(aposToQuotes("{'value':true}"),
-                mapper.writeValueAsString(new SimpleWrapper(Boolean.TRUE)));
-    }
-
-    // [databind#340]
-    public void testPolymorphicAtomicReference() throws Exception
-    {
-        RefWrapper input = new RefWrapper(13);
-        String json = MAPPER.writeValueAsString(input);
-        
-        RefWrapper result = MAPPER.readValue(json, RefWrapper.class);
-        assertNotNull(result.w);
-        Object ob = result.w.get();
-        assertEquals(Impl.class, ob.getClass());
-        assertEquals(13, ((Impl) ob).value);
-    }
-
-    // [databind#740]
-    public void testFilteringOfAtomicReference() throws Exception
-    {
-        SimpleWrapper input = new SimpleWrapper(null);
-        ObjectMapper mapper = MAPPER;
-
-        // by default, include as null
-        assertEquals(aposToQuotes("{'value':null}"), mapper.writeValueAsString(input));
-
-        // ditto with "no nulls"
-        mapper = new ObjectMapper().setSerializationInclusion(JsonInclude
-                .Include.NON_NULL);
-        assertEquals(aposToQuotes("{'value':null}"), mapper.writeValueAsString(input));
-
-        // but not with "non empty"
-        mapper = new ObjectMapper().setSerializationInclusion(JsonInclude
-                .Include.NON_EMPTY);
-        assertEquals("{}", mapper.writeValueAsString(input));
-    }
-
-    public void testTypeRefinement() throws Exception
-    {
-        RefiningWrapper input = new RefiningWrapper();
-        BigDecimal bd = new BigDecimal("0.25");
-        input.value = new AtomicReference(bd);
-        String json = MAPPER.writeValueAsString(input);
-
-        // so far so good. But does it come back as expected?
-        RefiningWrapper result = MAPPER.readValue(json, RefiningWrapper.class);
-        assertNotNull(result.value);
-        Object ob = result.value.get();
-        assertEquals(BigDecimal.class, ob.getClass());
-        assertEquals(bd, ob);
-    }
-
-    // [databind#882]: verify `@JsonDeserialize(contentAs=)` works with AtomicReference
-    public void testDeserializeWithContentAs() throws Exception
-    {
-        AtomicRefReadWrapper result = MAPPER.readValue(aposToQuotes("{'value':'abc'}"),
-                AtomicRefReadWrapper.class);
-         Object v = result.value.get();
-         assertNotNull(v);
-         assertEquals(WrappedString.class, v.getClass());
-         assertEquals("abc", ((WrappedString)v).value);
-    }
-    
-    // [databind#932]: support unwrapping too
-    public void testWithUnwrapping() throws Exception
-    {
-         String jsonExp = aposToQuotes("{'XX.name':'Bob'}");
-         String jsonAct = MAPPER.writeValueAsString(new UnwrappingRefParent());
-         assertEquals(jsonExp, jsonAct);
-    }
-
-    public void testWithCustomDeserializer() throws Exception
-    {
-        LCStringWrapper w = MAPPER.readValue(aposToQuotes("{'value':'FoobaR'}"),
-                LCStringWrapper.class);
-        assertEquals("foobar", w.value.get());
-    }
-
-    public void testEmpty1256() throws Exception
-    {
-        ObjectMapper mapper = new ObjectMapper();
-        mapper.setSerializationInclusion(JsonInclude.Include.NON_ABSENT);
-
-        String json = mapper.writeValueAsString(new Issue1256Bean());
-        assertEquals("{}", json);
-    }
-
-    // [databind#1307]
-    @SuppressWarnings("unchecked")
-    public void testNullValueHandling() throws Exception
-    {
-        ObjectMapper mapper = new ObjectMapper();
-        AtomicReference inputData = new AtomicReference();
-        String json = mapper.writeValueAsString(inputData);
-        AtomicReference readData = (AtomicReference) mapper.readValue(json, AtomicReference.class);
-        assertNotNull(readData);
-        assertNull(readData.get());
-    }
-}
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/MapDeserializationTest.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/MapDeserializationTest.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/MapDeserializationTest.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/MapDeserializationTest.java	2019-08-06 01:40:09.000000000 +0000
@@ -78,6 +78,10 @@
 
     static class ClassStringMap extends HashMap,String> { }
     
+    static class AbstractMapWrapper {
+        public AbstractMap values;
+    }
+
     /*
     /**********************************************************
     /* Test methods, untyped (Object valued) maps
@@ -275,6 +279,14 @@
         assertNull(result.get(""));
     }
 
+    public void testAbstractMapDefault() throws Exception
+    {
+        final AbstractMapWrapper result = MAPPER.readValue("{\"values\":{\"foo\":42}}",
+                AbstractMapWrapper.class);
+        assertNotNull(result);
+        assertEquals(LinkedHashMap.class, result.values.getClass());
+    }
+
     /*
     /**********************************************************
     /* Test methods, maps with enums
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/TestDefaultForUtilCollections1868.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/TestDefaultForUtilCollections1868.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/TestDefaultForUtilCollections1868.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/TestDefaultForUtilCollections1868.java	1970-01-01 00:00:00.000000000 +0000
@@ -1,116 +0,0 @@
-package com.fasterxml.jackson.databind.deser.jdk;
-
-import java.util.*;
-
-import com.fasterxml.jackson.annotation.JsonTypeInfo;
-import com.fasterxml.jackson.databind.BaseMapTest;
-import com.fasterxml.jackson.databind.ObjectMapper;
-
-// Unit tests for [databind#1868], related
-public class TestDefaultForUtilCollections1868 extends BaseMapTest
-{
-   private final ObjectMapper DEFAULT_MAPPER = new ObjectMapper();
-   {
-       DEFAULT_MAPPER.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
-   }
-
-   /*
-   /**********************************************************
-   /* Unit tests, "empty" types
-   /**********************************************************
-    */
-
-   public void testEmptyList() throws Exception {
-       _verifyCollection(Collections.emptyList());
-   }
-
-   public void testEmptySet() throws Exception {
-       _verifyCollection(Collections.emptySet());
-   }
-
-   public void testEmptyMap() throws Exception {
-       _verifyMap(Collections.emptyMap());
-   }
-
-   /*
-   /**********************************************************
-   /* Unit tests, "singleton" types
-   /**********************************************************
-    */
-
-   public void testSingletonList() throws Exception {
-       _verifyCollection(Collections.singletonList(Arrays.asList("TheOne")));
-   }
-
-   public void testSingletonSet() throws Exception {
-       _verifyCollection(Collections.singleton(Arrays.asList("TheOne")));
-   }
-
-   public void testSingletonMap() throws Exception {
-       _verifyMap(Collections.singletonMap("foo", "bar"));
-   }
-
-   /*
-   /**********************************************************
-   /* Unit tests, "unmodifiable" types
-   /**********************************************************
-    */
-
-   public void testUnmodifiableList() throws Exception {
-       _verifyCollection(Collections.unmodifiableList(Arrays.asList("first", "second")));
-   }
-
-   public void testUnmodifiableSet() throws Exception
-   {
-       Set input = new LinkedHashSet<>(Arrays.asList("first", "second"));
-       _verifyCollection(Collections.unmodifiableSet(input));
-   }
-
-   public void testUnmodifiableMap() throws Exception
-   {
-       Map input = new LinkedHashMap<>();
-       input.put("a", "b");
-       input.put("c", "d");
-       _verifyMap(Collections.unmodifiableMap(input));
-   }
-
-   /*
-   /**********************************************************
-   /* Unit tests, other
-   /**********************************************************
-    */
-
-   public void testArraysAsList() throws Exception
-   {
-       // Here there are no semantics to preserve, so simply check that
-       // contents remain the same
-       List input = Arrays.asList("a", "bc", "def");
-       String json = DEFAULT_MAPPER.writeValueAsString(input);
-       List result = DEFAULT_MAPPER.readValue(json, List.class);
-       assertEquals(input, result);
-   }
-
-   /*
-   /**********************************************************
-   /* Helper methods
-   /**********************************************************
-    */
-
-   protected void _verifyCollection(Collection exp) throws Exception
-   {
-       String json = DEFAULT_MAPPER.writeValueAsString(exp);
-       Collection act = DEFAULT_MAPPER.readValue(json, Collection.class);
-       
-       assertEquals(exp, act);
-       assertEquals(exp.getClass(), act.getClass());
-   }
-
-   protected void _verifyMap(Map exp) throws Exception
-   {
-       String json = DEFAULT_MAPPER.writeValueAsString(exp);
-       Map act = DEFAULT_MAPPER.readValue(json, Map.class);
-
-       assertEquals(exp, act);
-       assertEquals(exp.getClass(), act.getClass());
-   }
-}
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/UtilCollectionsTypesTest.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/UtilCollectionsTypesTest.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/deser/jdk/UtilCollectionsTypesTest.java	1970-01-01 00:00:00.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/deser/jdk/UtilCollectionsTypesTest.java	2019-08-06 01:40:09.000000000 +0000
@@ -0,0 +1,133 @@
+package com.fasterxml.jackson.databind.deser.jdk;
+
+import java.util.*;
+
+import com.fasterxml.jackson.annotation.JsonTypeInfo;
+import com.fasterxml.jackson.databind.BaseMapTest;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+// Unit tests for [databind#1868], [databind#1880], [databind#2265]
+public class UtilCollectionsTypesTest extends BaseMapTest
+{
+   private final ObjectMapper DEFAULT_MAPPER = new ObjectMapper();
+   {
+       DEFAULT_MAPPER.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL, JsonTypeInfo.As.PROPERTY);
+   }
+
+   /*
+   /**********************************************************
+   /* Unit tests, "empty" types
+   /**********************************************************
+    */
+
+   public void testEmptyList() throws Exception {
+       _verifyCollection(Collections.emptyList());
+   }
+
+   public void testEmptySet() throws Exception {
+       _verifyCollection(Collections.emptySet());
+   }
+
+   public void testEmptyMap() throws Exception {
+       _verifyMap(Collections.emptyMap());
+   }
+
+   /*
+   /**********************************************************
+   /* Unit tests, "singleton" types
+   /**********************************************************
+    */
+
+   public void testSingletonList() throws Exception {
+       _verifyCollection(Collections.singletonList(Arrays.asList("TheOne")));
+   }
+
+   public void testSingletonSet() throws Exception {
+       _verifyCollection(Collections.singleton(Arrays.asList("TheOne")));
+   }
+
+   public void testSingletonMap() throws Exception {
+       _verifyMap(Collections.singletonMap("foo", "bar"));
+   }
+
+   /*
+   /**********************************************************
+   /* Unit tests, "unmodifiable" types
+   /**********************************************************
+    */
+
+   public void testUnmodifiableList() throws Exception {
+       _verifyCollection(Collections.unmodifiableList(Arrays.asList("first", "second")));
+   }
+
+   // [databind#2265]
+   public void testUnmodifiableListFromLinkedList() throws Exception {
+       final List input = new LinkedList<>();
+       input.add("first");
+       input.add("second");
+
+       // Can't use simple "_verifyCollection" as type may change; instead use
+       // bit more flexible check:
+       Collection act = _writeReadCollection(Collections.unmodifiableList(input));
+       assertEquals(input, act);
+
+       // and this check may be bit fragile (may need to revisit), but is good enough for now:
+       assertEquals(Collections.unmodifiableList(new ArrayList<>(input)).getClass(), act.getClass());
+   }
+
+   public void testUnmodifiableSet() throws Exception
+   {
+       Set input = new LinkedHashSet<>(Arrays.asList("first", "second"));
+       _verifyCollection(Collections.unmodifiableSet(input));
+   }
+
+   public void testUnmodifiableMap() throws Exception
+   {
+       Map input = new LinkedHashMap<>();
+       input.put("a", "b");
+       input.put("c", "d");
+       _verifyMap(Collections.unmodifiableMap(input));
+   }
+
+   /*
+   /**********************************************************
+   /* Unit tests, other
+   /**********************************************************
+    */
+
+   public void testArraysAsList() throws Exception
+   {
+       // Here there are no semantics to preserve, so simply check that
+       // contents remain the same
+       List input = Arrays.asList("a", "bc", "def");
+       String json = DEFAULT_MAPPER.writeValueAsString(input);
+       List result = DEFAULT_MAPPER.readValue(json, List.class);
+       assertEquals(input, result);
+   }
+
+   /*
+   /**********************************************************
+   /* Helper methods
+   /**********************************************************
+    */
+
+   protected void _verifyCollection(Collection exp) throws Exception {
+       Collection act = _writeReadCollection(exp);
+       assertEquals(exp, act);
+       assertEquals(exp.getClass(), act.getClass());
+   }
+
+   protected Collection _writeReadCollection(Collection input) throws Exception {
+       final String json = DEFAULT_MAPPER.writeValueAsString(input);
+       return DEFAULT_MAPPER.readValue(json, Collection.class);
+   }
+   
+   protected void _verifyMap(Map exp) throws Exception
+   {
+       String json = DEFAULT_MAPPER.writeValueAsString(exp);
+       Map act = DEFAULT_MAPPER.readValue(json, Map.class);
+
+       assertEquals(exp, act);
+       assertEquals(exp.getClass(), act.getClass());
+   }
+}
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/introspect/TestNamingStrategyStd.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/introspect/TestNamingStrategyStd.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/introspect/TestNamingStrategyStd.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/introspect/TestNamingStrategyStd.java	2019-08-06 01:40:09.000000000 +0000
@@ -168,8 +168,10 @@
                 // [databind#1026]
                 {"usId", "us_id" },
                 {"uId", "u_id" },
+                // [databind#2267]
+                {"xCoordinate", "x_coordinate" },
     });
-    
+
     private ObjectMapper _lcWithUndescoreMapper;
     
     @Override
@@ -363,30 +365,30 @@
 
     public void testExplicitRename() throws Exception
     {
-      ObjectMapper m = new ObjectMapper();
-      m.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
-      m.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
-      // by default, renaming will not take place on explicitly named fields
-      assertEquals(aposToQuotes("{'firstName':'Peter','lastName':'Venkman','user_age':'35'}"),
-          m.writeValueAsString(new ExplicitBean()));
-
-      m = new ObjectMapper();
-      m.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
-      m.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
-      m.enable(MapperFeature.ALLOW_EXPLICIT_PROPERTY_RENAMING);
-      // w/ feature enabled, ALL property names should get re-written
-      assertEquals(aposToQuotes("{'first_name':'Peter','last_name':'Venkman','user_age':'35'}"),
-          m.writeValueAsString(new ExplicitBean()));
-
-      // test deserialization as well
-      ExplicitBean bean =
-          m.readValue(aposToQuotes("{'first_name':'Egon','last_name':'Spengler','user_age':'32'}"),
-              ExplicitBean.class);
-
-      assertNotNull(bean);
-      assertEquals("Egon", bean.userFirstName);
-      assertEquals("Spengler", bean.userLastName);
-      assertEquals("32", bean.userAge);
+        ObjectMapper m = new ObjectMapper();
+        m.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
+        m.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
+        // by default, renaming will not take place on explicitly named fields
+        assertEquals(aposToQuotes("{'firstName':'Peter','lastName':'Venkman','user_age':'35'}"),
+                m.writeValueAsString(new ExplicitBean()));
+
+        m = new ObjectMapper();
+        m.setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE);
+        m.enable(MapperFeature.SORT_PROPERTIES_ALPHABETICALLY);
+        m.enable(MapperFeature.ALLOW_EXPLICIT_PROPERTY_RENAMING);
+        // w/ feature enabled, ALL property names should get re-written
+        assertEquals(aposToQuotes("{'first_name':'Peter','last_name':'Venkman','user_age':'35'}"),
+                m.writeValueAsString(new ExplicitBean()));
+
+        // test deserialization as well
+        ExplicitBean bean =
+                m.readValue(aposToQuotes("{'first_name':'Egon','last_name':'Spengler','user_age':'32'}"),
+                        ExplicitBean.class);
+
+        assertNotNull(bean);
+        assertEquals("Egon", bean.userFirstName);
+        assertEquals("Spengler", bean.userLastName);
+        assertEquals("32", bean.userAge);
     }
 
     // Also verify that "no naming strategy" should be ok
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/module/SimpleModuleTest.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/module/SimpleModuleTest.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/module/SimpleModuleTest.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/module/SimpleModuleTest.java	2019-08-06 01:40:09.000000000 +0000
@@ -319,6 +319,7 @@
         AnotherSimpleModule mod2 = new AnotherSimpleModule("test2", Version.unknownVersion());
 
         ObjectMapper mapper = new ObjectMapper();
+
         mapper.registerModule(mod1);
         mapper.registerModule(mod2);
 
@@ -326,6 +327,10 @@
         assertEquals(2, registeredModuleIds.size());
         assertTrue(registeredModuleIds.contains(mod1.getTypeId()));
         assertTrue(registeredModuleIds.contains(mod2.getTypeId()));
+
+        // 01-Jul-2019, [databind#2374]: verify empty list is fine
+        mapper = new ObjectMapper();
+        assertEquals(0, mapper.getRegisteredModuleIds().size());
     }
 
     /*
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/module/TestTypeModifiers.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/module/TestTypeModifiers.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/databind/module/TestTypeModifiers.java	2018-12-15 21:58:28.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/databind/module/TestTypeModifiers.java	2019-08-06 01:40:09.000000000 +0000
@@ -230,7 +230,21 @@
         assertNotNull(param);
         assertSame(Integer.class, param.getRawClass());
     }
-    
+
+    // [databind#2395] Can trigger problem this way too
+    // NOTE: oddly enough, seems to ONLY fail 
+    public void testTypeResolutionForRecursive() throws Exception
+    {
+        ObjectMapper mapper = new ObjectMapper();
+        mapper.registerModule(new SimpleModule() {
+            @Override
+            public void setupModule(SetupContext context) {
+                context.addTypeModifier(new MyTypeModifier());
+            }
+        });
+        assertNotNull(mapper.readTree("{}"));
+    }
+
     public void testCollectionLikeTypeConstruction() throws Exception
     {
         ObjectMapper mapper = new ObjectMapper();
diff -Nru jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/failing/DelegatingCreatorWithAbstractProp2252Test.java jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/failing/DelegatingCreatorWithAbstractProp2252Test.java
--- jackson-databind-2.9.8/src/test/java/com/fasterxml/jackson/failing/DelegatingCreatorWithAbstractProp2252Test.java	1970-01-01 00:00:00.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/java/com/fasterxml/jackson/failing/DelegatingCreatorWithAbstractProp2252Test.java	2019-08-06 01:40:09.000000000 +0000
@@ -0,0 +1,39 @@
+package com.fasterxml.jackson.failing;
+
+import java.util.*;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.databind.*;
+
+public class DelegatingCreatorWithAbstractProp2252Test extends BaseMapTest
+{
+    static class DelegatingWithAbstractSetter
+    {
+        Map _stuff;
+
+        @JsonCreator(mode = JsonCreator.Mode.DELEGATING)
+        public DelegatingWithAbstractSetter(Map stuff) {
+            _stuff = stuff;
+        }
+
+        public void setNeverUsed(MyAbstractList bogus) { }
+    }
+
+    // NOTE! Abstract POJO is fine, only Map/Collection causes issues for some reason
+    
+//    static abstract class MyAbstractMap extends AbstractMap { }
+
+    @SuppressWarnings("serial")
+    static abstract class MyAbstractList extends ArrayList { }
+
+    private final ObjectMapper MAPPER = newObjectMapper();
+
+    // loosely based on [databind#2251], in which delegating creator is used, but
+    // theoretically necessary type for setter can cause issues -- shouldn't, as no
+    // setters (or fields, getter-as-setter) are ever needed due to delegation
+    public void testDelegatingWithUnsupportedSetterType() throws Exception
+    {
+        DelegatingWithAbstractSetter result = MAPPER.readValue("{ \"bogus\": 3 }",DelegatingWithAbstractSetter.class);
+        assertNotNull(result);
+    }
+}
diff -Nru jackson-databind-2.9.8/src/test/resources/com/fasterxml/jackson/databind/deser/DummyProcessableContent.json jackson-databind-2.9.9.3/src/test/resources/com/fasterxml/jackson/databind/deser/DummyProcessableContent.json
--- jackson-databind-2.9.8/src/test/resources/com/fasterxml/jackson/databind/deser/DummyProcessableContent.json	1970-01-01 00:00:00.000000000 +0000
+++ jackson-databind-2.9.9.3/src/test/resources/com/fasterxml/jackson/databind/deser/DummyProcessableContent.json	2019-08-06 01:40:09.000000000 +0000
@@ -0,0 +1,21 @@
+{
+	"_class":"com.fasterxml.jackson.databind.deser.GenericContent",
+	"innerObjects":
+		[
+			"java.util.ArrayList",
+			[
+				[
+					"com.fasterxml.jackson.databind.deser.HandleUnknowTypeIdTest$DummyContent",
+					{
+						"aField":"some value"
+					}
+				],
+				[
+					"com.fasterxml.jackson.databind.deser.HandleUnknowTypeIdTest$AnInventedClassBeingNotOnTheClasspath",
+					{
+						"aField":"some value"
+					}
+				]
+			]
+		]
+}
\ No newline at end of file