diff options
-rw-r--r-- | core/java/android/content/pm/LimitedLengthInputStream.java | 2 | ||||
-rw-r--r-- | core/java/android/os/FileBridge.java | 3 | ||||
-rw-r--r-- | core/java/android/os/Parcel.java | 3 | ||||
-rw-r--r-- | core/java/com/android/internal/util/ArrayUtils.java | 19 | ||||
-rw-r--r-- | core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java | 85 | ||||
-rw-r--r-- | drm/java/android/drm/DrmOutputStream.java | 3 |
6 files changed, 111 insertions, 4 deletions
diff --git a/core/java/android/content/pm/LimitedLengthInputStream.java b/core/java/android/content/pm/LimitedLengthInputStream.java index 19b681e4373a..05089f6e0165 100644 --- a/core/java/android/content/pm/LimitedLengthInputStream.java +++ b/core/java/android/content/pm/LimitedLengthInputStream.java @@ -1,6 +1,6 @@ package android.content.pm; -import libcore.util.ArrayUtils; +import com.android.internal.util.ArrayUtils; import java.io.FilterInputStream; import java.io.IOException; diff --git a/core/java/android/os/FileBridge.java b/core/java/android/os/FileBridge.java index ab5637cbb878..7b84575a8955 100644 --- a/core/java/android/os/FileBridge.java +++ b/core/java/android/os/FileBridge.java @@ -22,11 +22,12 @@ import android.system.ErrnoException; import android.system.Os; import android.util.Log; +import com.android.internal.util.ArrayUtils; + import libcore.io.IoBridge; import libcore.io.IoUtils; import libcore.io.Memory; import libcore.io.Streams; -import libcore.util.ArrayUtils; import java.io.FileDescriptor; import java.io.IOException; diff --git a/core/java/android/os/Parcel.java b/core/java/android/os/Parcel.java index cf90174924f1..6acdcc4722d2 100644 --- a/core/java/android/os/Parcel.java +++ b/core/java/android/os/Parcel.java @@ -33,11 +33,12 @@ import android.util.SparseArray; import android.util.SparseBooleanArray; import android.util.SparseIntArray; +import com.android.internal.util.ArrayUtils; + import dalvik.annotation.optimization.CriticalNative; import dalvik.annotation.optimization.FastNative; import dalvik.system.VMRuntime; -import libcore.util.ArrayUtils; import libcore.util.SneakyThrow; import java.io.ByteArrayInputStream; diff --git a/core/java/com/android/internal/util/ArrayUtils.java b/core/java/com/android/internal/util/ArrayUtils.java index 9ad15021f651..931ec64df755 100644 --- a/core/java/com/android/internal/util/ArrayUtils.java +++ b/core/java/com/android/internal/util/ArrayUtils.java @@ -734,6 +734,25 @@ public class ArrayUtils { } /** + * Throws {@link ArrayIndexOutOfBoundsException} if the range is out of bounds. + * @param len length of the array. Must be non-negative + * @param offset start index of the range. Must be non-negative + * @param count length of the range. Must be non-negative + * @throws ArrayIndexOutOfBoundsException if the range from {@code offset} with length + * {@code count} is out of bounds of the array + */ + public static void throwsIfOutOfBounds(int len, int offset, int count) { + if (len < 0) { + throw new ArrayIndexOutOfBoundsException("Negative length: " + len); + } + + if ((offset | count) < 0 || offset > len - count) { + throw new ArrayIndexOutOfBoundsException( + "length=" + len + "; regionStart=" + offset + "; regionLength=" + count); + } + } + + /** * Returns an array with values from {@code val} minus {@code null} values * * @param arrayConstructor typically {@code T[]::new} e.g. {@code String[]::new} diff --git a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java index d0267355c92e..e8793a9f6097 100644 --- a/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java +++ b/core/tests/coretests/src/com/android/internal/util/ArrayUtilsTest.java @@ -118,4 +118,89 @@ public class ArrayUtilsTest extends TestCase { assertEquals(3, ArrayUtils.unstableRemoveIf(collection, isNull)); assertEquals(0, collection.size()); } + + @SmallTest + public void testThrowsIfOutOfBounds_passesWhenRangeInsideArray() { + ArrayUtils.throwsIfOutOfBounds(10, 2, 6); + } + + @SmallTest + public void testThrowsIfOutOfBounds_passesWhenRangeIsWholeArray() { + ArrayUtils.throwsIfOutOfBounds(10, 0, 10); + } + + @SmallTest + public void testThrowsIfOutOfBounds_passesWhenEmptyRangeAtStart() { + ArrayUtils.throwsIfOutOfBounds(10, 0, 0); + } + + @SmallTest + public void testThrowsIfOutOfBounds_passesWhenEmptyRangeAtEnd() { + ArrayUtils.throwsIfOutOfBounds(10, 10, 0); + } + + @SmallTest + public void testThrowsIfOutOfBounds_passesWhenEmptyArray() { + ArrayUtils.throwsIfOutOfBounds(0, 0, 0); + } + + @SmallTest + public void testThrowsIfOutOfBounds_failsWhenRangeStartNegative() { + try { + ArrayUtils.throwsIfOutOfBounds(10, -1, 5); + fail(); + } catch (ArrayIndexOutOfBoundsException expected) { + // expected + } + } + + @SmallTest + public void testThrowsIfOutOfBounds_failsWhenCountNegative() { + try { + ArrayUtils.throwsIfOutOfBounds(10, 5, -1); + fail(); + } catch (ArrayIndexOutOfBoundsException expected) { + // expected + } + } + + @SmallTest + public void testThrowsIfOutOfBounds_failsWhenRangeStartTooHigh() { + try { + ArrayUtils.throwsIfOutOfBounds(10, 11, 0); + fail(); + } catch (ArrayIndexOutOfBoundsException expected) { + // expected + } + } + + @SmallTest + public void testThrowsIfOutOfBounds_failsWhenRangeEndTooHigh() { + try { + ArrayUtils.throwsIfOutOfBounds(10, 5, 6); + fail(); + } catch (ArrayIndexOutOfBoundsException expected) { + // expected + } + } + + @SmallTest + public void testThrowsIfOutOfBounds_failsWhenLengthNegative() { + try { + ArrayUtils.throwsIfOutOfBounds(-1, 0, 0); + fail(); + } catch (ArrayIndexOutOfBoundsException expected) { + // expected + } + } + + @SmallTest + public void testThrowsIfOutOfBounds_failsWhenOverflowRangeEndTooHigh() { + try { + ArrayUtils.throwsIfOutOfBounds(Integer.MAX_VALUE, Integer.MAX_VALUE, Integer.MAX_VALUE); + fail(); + } catch (ArrayIndexOutOfBoundsException expected) { + // expected + } + } } diff --git a/drm/java/android/drm/DrmOutputStream.java b/drm/java/android/drm/DrmOutputStream.java index 73e7f23b19c6..2a3f530e04c4 100644 --- a/drm/java/android/drm/DrmOutputStream.java +++ b/drm/java/android/drm/DrmOutputStream.java @@ -25,9 +25,10 @@ import android.system.ErrnoException; import android.system.Os; import android.util.Log; +import com.android.internal.util.ArrayUtils; + import libcore.io.IoBridge; import libcore.io.Streams; -import libcore.util.ArrayUtils; import java.io.FileDescriptor; import java.io.FilterOutputStream; |