[
https://issues.apache.org/jira/browse/CASSANDRA-21806?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=18131446#comment-18131446
]
Dmitry Konstantinov commented on CASSANDRA-21806:
-------------------------------------------------
1. CASSANDRA-20848 (Jackson upgrade for CVE-2025-52999) updated jackson-core
version from 2.15.3 to 2.19.2.
2. Jackson 2.16 added a default limit on JSON field-name length. I checked both
jars: 2.15.3 has no such limit, and 2.19.2 has DEFAULT_MAX_NAME_LEN = 50000.
3. JsonUtils.JSON_OBJECT_MAPPER is built with new ObjectMapper(new
JsonFactory()), so it picks up that default. Json.parseJson and FromJsonFct
both use this mapper.
4. A JSON field name must be a string, so a non-text CQL map key is written out
as its own JSON and then wrapped as a string. Each level of nesting escapes it
again (\u0001 → \\u0001 → \\\\u0001), and blobs double in size as hex.
- In the failing case the outer map key is a
frozen<map<vector<frozen<map<ascii,blob>>,3>, …>>.
- The generator produces ascii strings and blobs of up to 1,024 characters
or bytes, which pushes the key's JSON to 50,722 characters.
- Jackson rejects it with StreamConstraintsException: Name length (50722)
exceeds the maximum allowed (50000), and Json.parseJson reports that as an
InvalidRequestException.
> Flaky test - db.marshal.AbstractTypeTest.json
> ---------------------------------------------
>
> Key: CASSANDRA-21806
> URL: https://issues.apache.org/jira/browse/CASSANDRA-21806
> Project: Apache Cassandra
> Issue Type: Bug
> Reporter: Dmitry Konstantinov
> Priority: Normal
>
> [https://ci-cassandra.apache.org/job/Cassandra-trunk/2642/testReport/junit/org.apache.cassandra.db.marshal/AbstractTypeTest/Tests___test_system_keyspace_directory_jdk21_6_20___json_system_keyspace_directory_jdk21_x86_64/]
>
> {code:java}
> at
> org.apache.cassandra.db.marshal.AbstractTypeTest.lambda$json$10(AbstractTypeTest.java:542)
> at
> org.quicktheories.dsl.TheoryBuilder.lambda$checkAssert$7(TheoryBuilder.java:145)
> at org.quicktheories.impl.Property.tryFalsification(Property.java:23)
> at org.quicktheories.impl.Core.findFalsifyingValue(Core.java:76)
> at org.quicktheories.impl.Core.run(Core.java:35)
> at org.quicktheories.impl.TheoryRunner.runSearch(TheoryRunner.java:51)
> at org.quicktheories.impl.TheoryRunner.check(TheoryRunner.java:39)
> at org.quicktheories.dsl.TheoryBuilder.check(TheoryBuilder.java:132)
> at
> org.quicktheories.dsl.TheoryBuilder.checkAssert(TheoryBuilder.java:144)
> at
> org.apache.cassandra.db.marshal.AbstractTypeTest.json(AbstractTypeTest.java:523)
> at
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
> at
> java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:75)
> at
> java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:52)
> at java.base/java.lang.reflect.Method.invoke(Method.java:580)
> at
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
> at
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
> at
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
> at
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
> at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78)
> at
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57)
> at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
> at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
> at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
> at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
> at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
> at
> org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26)
> at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
> at junit.framework.JUnit4TestAdapter.run(JUnit4TestAdapter.java:38)
> at
> org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:535)
> at
> org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:1197)
> at
> org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:1042)
> Caused by: org.apache.cassandra.exceptions.InvalidRequestException: Could not
> decode JSON string as a map:
> com.fasterxml.jackson.core.exc.StreamConstraintsException: Name length
> (50722) exceeds the maximum allowed (50000, from
> `StreamReadConstraints.getMaxNameLength()`). (String was: {"":
> {"{\"[{\\\"\\\\u0001H\\\\u0004o\\\\u0002?
> ...
> at org.apache.cassandra.cql3.Json.parseJson(Json.java:319)
> at
> org.apache.cassandra.cql3.Json$Literal.prepareAndCollectMarkers(Json.java:70)
> at
> org.apache.cassandra.db.marshal.AbstractTypeTest.lambda$json$10(AbstractTypeTest.java:533)
> ... 31 more
> Other found falsifying value(s) :-
>
> Seed was 7225841195210567 {code}
--
This message was sent by Atlassian Jira
(v10.3.26#10030026)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]