Philip Warren created KAFKA-15423:
-------------------------------------
Summary: readUnsignedVarint implementation allows for negative
numbers
Key: KAFKA-15423
URL: https://issues.apache.org/jira/browse/KAFKA-15423
Project: Kafka
Issue Type: Improvement
Components: clients
Affects Versions: 3.5.1
Reporter: Philip Warren
The current implementation of {{ByteUtils.readUnsignedVarint}} throws an
IllegalArgumentException if the varint is encoded in more than 5 bytes which
avoids some invalid values, however it still allows for 35 bits of precision
instead of 31 bits of the underlying int type.
To make the method safer for callers, it seems like it should ensure that only
the 3 lower bits of the 5th byte are set as anything else will overflow a Java
int.
I've audited the codebase and there are some cases where a negative unsigned
varint will lead to calling {{new Object[length]}} (leading to an exception),
and a few potential values where reading a varint as a length (and subtracting
one) causes a negative length of MIN_INT to wrap and become equal to MAX_INT.
As the KIP specs refer to varints as 31-bit integers (i.e.
[KIP-482|https://cwiki.apache.org/confluence/display/KAFKA/KIP-482]), it would
be good if the methods decoding them should also enforce this constraint.
--
This message was sent by Atlassian Jira
(v8.20.10#820010)