From e8842b939ccb4dc246e30b9a8aa1676f03a65539 Mon Sep 17 00:00:00 2001 From: ibaker Date: Mon, 10 Mar 2025 10:01:36 -0700 Subject: [PATCH] Prevent `ParsableByteArray.bytesLeft()` returning a negative value PiperOrigin-RevId: 735417945 --- .../media3/common/util/ParsableByteArray.java | 4 ++-- .../androidx/media3/common/util/Util.java | 2 +- .../common/util/ParsableByteArrayTest.java | 20 +++++++++++++++++++ 3 files changed, 23 insertions(+), 3 deletions(-) diff --git a/libraries/common/src/main/java/androidx/media3/common/util/ParsableByteArray.java b/libraries/common/src/main/java/androidx/media3/common/util/ParsableByteArray.java index 7fcc0fa4eb..d1b2cf00c2 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/ParsableByteArray.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/ParsableByteArray.java @@ -142,7 +142,7 @@ public final class ParsableByteArray { /** Returns the number of bytes yet to be read. */ public int bytesLeft() { - return limit - position; + return Math.max(limit - position, 0); } /** Returns the limit. */ @@ -261,7 +261,7 @@ public final class ParsableByteArray { public char peekChar(Charset charset) { Assertions.checkArgument( SUPPORTED_CHARSETS_FOR_READLINE.contains(charset), "Unsupported charset: " + charset); - if (bytesLeft() < 1) { + if (bytesLeft() == 0) { return 0; } if (charset.equals(StandardCharsets.US_ASCII)) { diff --git a/libraries/common/src/main/java/androidx/media3/common/util/Util.java b/libraries/common/src/main/java/androidx/media3/common/util/Util.java index 6626cff721..eca114ec3e 100644 --- a/libraries/common/src/main/java/androidx/media3/common/util/Util.java +++ b/libraries/common/src/main/java/androidx/media3/common/util/Util.java @@ -3061,7 +3061,7 @@ public final class Util { @UnstableApi public static boolean inflate( ParsableByteArray input, ParsableByteArray output, @Nullable Inflater inflater) { - if (input.bytesLeft() <= 0) { + if (input.bytesLeft() == 0) { return false; } if (output.capacity() < input.bytesLeft()) { diff --git a/libraries/common/src/test/java/androidx/media3/common/util/ParsableByteArrayTest.java b/libraries/common/src/test/java/androidx/media3/common/util/ParsableByteArrayTest.java index 4b8674a422..22bea475ee 100644 --- a/libraries/common/src/test/java/androidx/media3/common/util/ParsableByteArrayTest.java +++ b/libraries/common/src/test/java/androidx/media3/common/util/ParsableByteArrayTest.java @@ -77,6 +77,26 @@ public final class ParsableByteArrayTest { 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 public void readShort() { testReadShort((short) -1);