[ 
https://issues.apache.org/jira/browse/ZOOKEEPER-4843?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Andor Molnar updated ZOOKEEPER-4843:
------------------------------------
    Fix Version/s: 3.8.5

> Encountering an 'Unreasonable Length' error when configuring jute.maxbuffer 
> to 1GB or more
> ------------------------------------------------------------------------------------------
>
>                 Key: ZOOKEEPER-4843
>                 URL: https://issues.apache.org/jira/browse/ZOOKEEPER-4843
>             Project: ZooKeeper
>          Issue Type: Bug
>    Affects Versions: 3.8.4, 3.9.2
>            Reporter: Mohammad Arshad
>            Assignee: Mohammad Arshad
>            Priority: Major
>              Labels: pull-request-available
>             Fix For: 3.10.0, 3.8.5, 3.9.3
>
>          Time Spent: 1h 20m
>  Remaining Estimate: 0h
>
> *Problem:*
> Encountering an 'Unreasonable Length' error when configuring jute.maxbuffer 
> to 1GB or more
> {code:java}
> 2024-07-04 11:55:41,806 [myid:localhost:2181] - WARN  
> [main-SendThread(localhost:2181):o.a.z.ClientCnxn$SendThread@1300] - Session 
> 0x0 for server localhost/127.0.0.1:2181, Closing socket connection.
> Attempting reconnect except it is a SessionExpiredException.
> java.io.IOException: Unreasonable length = 16
>         at 
> org.apache.jute.BinaryInputArchive.checkLength(BinaryInputArchive.java:166)
>         at 
> org.apache.jute.BinaryInputArchive.readBuffer(BinaryInputArchive.java:127)
>         at 
> org.apache.zookeeper.proto.ConnectResponse.deserialize(ConnectResponse.java:80)
>         at 
> org.apache.zookeeper.ClientCnxnSocket.readConnectResult(ClientCnxnSocket.java:141)
>         at 
> org.apache.zookeeper.ClientCnxnSocketNIO.doIO(ClientCnxnSocketNIO.java:86)
>         at 
> org.apache.zookeeper.ClientCnxnSocketNIO.doTransport(ClientCnxnSocketNIO.java:350)
>         at 
> org.apache.zookeeper.ClientCnxn$SendThread.run(ClientCnxn.java:1289)
> 2024-07-04 11:55:42,567 [myid:] - INFO  [main:o.a.z.u.ServiceUtils@45] - 
> Exiting JVM with code 0
> {code}
> *Analysis:*
> If jute.maxbuffer is set to 1GB (equivalent to 1073741824 bytes), this means 
> that both maxBufferSize and extraMaxBufferSize are also set to 1073741824.
> Even when the response size (denoted as 'len') is minimal, the following 
> condition check still fails:
> {code:java}
> if (len < 0 || len > maxBufferSize + extraMaxBufferSize) {
>     throw new IOException(UNREASONBLE_LENGTH + len);
> }
> {code}
> It is because (maxBufferSize + extraMaxBufferSize) overflow int MAX_VALUE and 
> the result is a negative number.
> *Solution:*
> Configure jute.maxbuffer.extrasize explicitly and give a reasonable value, so 
> that the sum of maxBufferSize and extraMaxBufferSize is less than 
> Integer.MAX_VALUE.
> *Improvement:*
> While setting jute.maxbuffer to 1GB may seem unreasonable, it would be better 
> to validate the maxBuffer and extraMaxBufferSize configuration.
> If the sum of these two values is greater than Integer.MAX_VALUE, it should 
> be handled gracefully by setting the sum to Integer.MAX_VALUE



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

Reply via email to