[ 
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]

Reply via email to