From bb044563245b3cf41772cf73ee5c75d84633f00b Mon Sep 17 00:00:00 2001 From: aquilescanta Date: Fri, 28 Jul 2017 04:39:57 -0700 Subject: [PATCH] Fix IndexOutOfBounds when reading a multiple of 8 number of bits ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=163455269 --- .../android/exoplayer2/util/ParsableBitArrayTest.java | 6 +++++- .../google/android/exoplayer2/util/ParsableBitArray.java | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/library/core/src/androidTest/java/com/google/android/exoplayer2/util/ParsableBitArrayTest.java b/library/core/src/androidTest/java/com/google/android/exoplayer2/util/ParsableBitArrayTest.java index fc8318d826..d7b2b36740 100644 --- a/library/core/src/androidTest/java/com/google/android/exoplayer2/util/ParsableBitArrayTest.java +++ b/library/core/src/androidTest/java/com/google/android/exoplayer2/util/ParsableBitArrayTest.java @@ -87,9 +87,13 @@ public final class ParsableBitArrayTest extends TestCase { result[1] = 0; testArray.readBits(result, 1, 0); assertEquals(0, result[1]); + // Test reading a number of bits divisible by 8. + testArray.setPosition(0); + testArray.readBits(result, 0, 16); + assertEquals(TEST_DATA[0], result[0]); + assertEquals(TEST_DATA[1], result[1]); // Test least significant bits are unmodified. result[1] = (byte) 0xFF; - testArray.setPosition(16); testArray.readBits(result, 0, 9); assertEquals(0x5F, result[0]); assertEquals(0x7F, result[1]); diff --git a/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableBitArray.java b/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableBitArray.java index e0238cb14d..fdee7fb5e6 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableBitArray.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/util/ParsableBitArray.java @@ -192,6 +192,9 @@ public final class ParsableBitArray { } // Trailing bits. int bitsLeft = numBits & 7 /* numBits % 8 */; + if (bitsLeft == 0) { + return; + } buffer[to] &= 0xFF >> bitsLeft; // Set to 0 the bits that are going to be overwritten. if (bitOffset + bitsLeft > 8) { // We read the rest of data[byteOffset] and increase byteOffset.