You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "rootvector2 (via GitHub)" <gi...@apache.org> on 2026/06/21 19:57:11 UTC
[PR] reject invalid load factor in hashed/reference map doReadObject [commons-collections]
rootvector2 opened a new pull request, #691:
URL: https://github.com/apache/commons-collections/pull/691
found auditing the map package deserialization paths: the `AbstractHashedMap` and `AbstractReferenceMap` constructors reject a `loadFactor` that is non-positive or `NaN`, but their `doReadObject` overrides read it straight from the stream, so a crafted serialized map deserializes with a `loadFactor` no constructor allows and a `threshold` of 0 that makes `checkCapacity` resize the bucket array on every `put` (a 12-entry map grows its backing array from 16 to 65536); this re-applies the check in both methods (`AbstractReferenceMap` does not call `super.doReadObject`) and throws `InvalidObjectException`.
- [x] Read the [contribution guidelines](CONTRIBUTING.md) for this project.
- [ ] Read the [ASF Generative Tooling Guidance](https://www.apache.org/legal/generative-tooling.html) if you use Artificial Intelligence (AI).
- [ ] I used AI to create any part of, or all of, this pull request. Which AI tool was used to create this pull request, and to what extent did it contribute?
- [x] Run a successful build using the default [Maven](https://maven.apache.org/) goal with `mvn`; that's `mvn` on the command line by itself.
- [x] Write unit tests that match behavioral changes, where the tests fail if the changes to the runtime are not applied. This may not always be possible, but it is a best practice.
- [x] Write a pull request description that is detailed enough to understand what the pull request does, how, and why.
- [x] Each commit in the pull request should have a meaningful subject line and body. Note that a maintainer may squash commits during the merge process.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@commons.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] Reject invalid load factor in hashed/reference map doReadObject [commons-collections]
Posted by "rootvector2 (via GitHub)" <gi...@apache.org>.
rootvector2 commented on code in PR #691:
URL: https://github.com/apache/commons-collections/pull/691#discussion_r3454073123
##########
src/test/java/org/apache/commons/collections4/map/HashedMapTest.java:
##########
@@ -85,4 +90,20 @@ void testInternalState() {
// the threshold has changed due to calling ensureCapacity
assertEquals(96, map.threshold);
}
+
+ /**
+ * A crafted stream can carry a load factor the constructor rejects. AbstractHashedMap and
+ * AbstractReferenceMap (its own doReadObject override) must reapply that contract on read.
+ */
+ @ParameterizedTest
+ @ValueSource(floats = {0.0f, -1.0f, Float.NaN})
+ void testDeserializeRejectsInvalidLoadFactor(final float badLoadFactor) {
Review Comment:
added them: `CaseInsensitiveMapTest`, `LinkedMapTest` and `LRUMapTest` on the `AbstractHashedMap` side, and `ReferenceIdentityMapTest` on the `AbstractReferenceMap` side. each one is a small method using the shared `serializeDeserialize` helper rather than copy-pasted boilerplate.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@commons.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] Reject invalid load factor in hashed/reference map doReadObject [commons-collections]
Posted by "rootvector2 (via GitHub)" <gi...@apache.org>.
rootvector2 commented on PR #691:
URL: https://github.com/apache/commons-collections/pull/691#issuecomment-4767703081
done, switched it to a `@ParameterizedTest` with `@ValueSource` over the three bad load factors.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@commons.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] Reject invalid load factor in hashed/reference map doReadObject [commons-collections]
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory merged PR #691:
URL: https://github.com/apache/commons-collections/pull/691
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@commons.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] Reject invalid load factor in hashed/reference map doReadObject [commons-collections]
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on code in PR #691:
URL: https://github.com/apache/commons-collections/pull/691#discussion_r3452928817
##########
src/test/java/org/apache/commons/collections4/map/HashedMapTest.java:
##########
@@ -85,4 +90,20 @@ void testInternalState() {
// the threshold has changed due to calling ensureCapacity
assertEquals(96, map.threshold);
}
+
+ /**
+ * A crafted stream can carry a load factor the constructor rejects. AbstractHashedMap and
+ * AbstractReferenceMap (its own doReadObject override) must reapply that contract on read.
+ */
+ @ParameterizedTest
+ @ValueSource(floats = {0.0f, -1.0f, Float.NaN})
+ void testDeserializeRejectsInvalidLoadFactor(final float badLoadFactor) {
Review Comment:
@rootvector2
Thank you for the update. You forgot to add tests for the other concrete subclasses of the two abstract classes this PR modifies.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@commons.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] Reject invalid load factor in hashed/reference map doReadObject [commons-collections]
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on code in PR #691:
URL: https://github.com/apache/commons-collections/pull/691#discussion_r3451835610
##########
src/test/java/org/apache/commons/collections4/map/HashedMapTest.java:
##########
@@ -85,4 +90,20 @@ void testInternalState() {
// the threshold has changed due to calling ensureCapacity
assertEquals(96, map.threshold);
}
+
+ /**
+ * A crafted stream can carry a load factor the constructor rejects. AbstractHashedMap and
+ * AbstractReferenceMap (its own doReadObject override) must reapply that contract on read.
+ */
+ @ParameterizedTest
+ @ValueSource(floats = {0.0f, -1.0f, Float.NaN})
+ void testDeserializeRejectsInvalidLoadFactor(final float badLoadFactor) {
Review Comment:
Hello @rootvector2
Thank you for your update.
I now realize this teste doesn't look right. The PR modifies two abstract classes. This test is in one of the concrete subclasses for only two subclasses. Instead, there should be one new test method in each concrete subclasses' Test class.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@commons.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] Reject invalid load factor in hashed/reference map doReadObject [commons-collections]
Posted by "rootvector2 (via GitHub)" <gi...@apache.org>.
rootvector2 commented on code in PR #691:
URL: https://github.com/apache/commons-collections/pull/691#discussion_r3452777032
##########
src/test/java/org/apache/commons/collections4/map/HashedMapTest.java:
##########
@@ -85,4 +90,20 @@ void testInternalState() {
// the threshold has changed due to calling ensureCapacity
assertEquals(96, map.threshold);
}
+
+ /**
+ * A crafted stream can carry a load factor the constructor rejects. AbstractHashedMap and
+ * AbstractReferenceMap (its own doReadObject override) must reapply that contract on read.
+ */
+ @ParameterizedTest
+ @ValueSource(floats = {0.0f, -1.0f, Float.NaN})
+ void testDeserializeRejectsInvalidLoadFactor(final float badLoadFactor) {
Review Comment:
good catch. moved the `ReferenceMap` case into `ReferenceMapTest` so each concrete subclass has its own test method, and `HashedMapTest` now only covers `HashedMap`.
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@commons.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org
Re: [PR] Reject invalid load factor in hashed/reference map doReadObject [commons-collections]
Posted by "garydgregory (via GitHub)" <gi...@apache.org>.
garydgregory commented on PR #691:
URL: https://github.com/apache/commons-collections/pull/691#issuecomment-4782518067
Thank you for the update @rootvector2 , merged 🚀
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: issues-unsubscribe@commons.apache.org
For queries about this service, please contact Infrastructure at:
users@infra.apache.org