Prevent ParsableByteArray.bytesLeft() returning a negative value

PiperOrigin-RevId: 735417945
This commit is contained in:
ibaker 2025-03-10 10:01:36 -07:00 committed by Copybara-Service
parent a110b02142
commit e8842b939c
3 changed files with 23 additions and 3 deletions

View File

@ -142,7 +142,7 @@ public final class ParsableByteArray {
/** Returns the number of bytes yet to be read. */ /** Returns the number of bytes yet to be read. */
public int bytesLeft() { public int bytesLeft() {
return limit - position; return Math.max(limit - position, 0);
} }
/** Returns the limit. */ /** Returns the limit. */
@ -261,7 +261,7 @@ public final class ParsableByteArray {
public char peekChar(Charset charset) { public char peekChar(Charset charset) {
Assertions.checkArgument( Assertions.checkArgument(
SUPPORTED_CHARSETS_FOR_READLINE.contains(charset), "Unsupported charset: " + charset); SUPPORTED_CHARSETS_FOR_READLINE.contains(charset), "Unsupported charset: " + charset);
if (bytesLeft() < 1) { if (bytesLeft() == 0) {
return 0; return 0;
} }
if (charset.equals(StandardCharsets.US_ASCII)) { if (charset.equals(StandardCharsets.US_ASCII)) {

View File

@ -3061,7 +3061,7 @@ public final class Util {
@UnstableApi @UnstableApi
public static boolean inflate( public static boolean inflate(
ParsableByteArray input, ParsableByteArray output, @Nullable Inflater inflater) { ParsableByteArray input, ParsableByteArray output, @Nullable Inflater inflater) {
if (input.bytesLeft() <= 0) { if (input.bytesLeft() == 0) {
return false; return false;
} }
if (output.capacity() < input.bytesLeft()) { if (output.capacity() < input.bytesLeft()) {

View File

@ -77,6 +77,26 @@ public final class ParsableByteArrayTest {
assertThat(array.limit()).isEqualTo(4); assertThat(array.limit()).isEqualTo(4);
} }
@Test
public void bytesLeft() {
ParsableByteArray array = getTestDataArray();
assertThat(array.bytesLeft()).isEqualTo(TEST_DATA.length);
array.setPosition(1);
array.setLimit(2);
assertThat(array.bytesLeft()).isEqualTo(1);
}
@Test
public void bytesLeft_positionExceedsLimit_returnsZero() {
ParsableByteArray array = getTestDataArray();
array.setLimit(1);
// readInt advances position without checking limit (see b/147657250)
int unused = array.readInt();
assertThat(array.bytesLeft()).isEqualTo(0);
}
@Test @Test
public void readShort() { public void readShort() {
testReadShort((short) -1); testReadShort((short) -1);