summaryrefslogtreecommitdiffstats
path: root/media/libstagefright/id3
diff options
context:
space:
mode:
authorJoshua J. Drake <android-open-source@qoop.org>2015-08-15 08:17:03 -0500
committerRobert Shih <robertshih@google.com>2015-08-21 16:06:23 -0700
commitc580c836c1941fb4912e1dd4e08626caf98a62c7 (patch)
tree11be8eb2577972b3c522503701a59af125ca0729 /media/libstagefright/id3
parent916a9684295fb578f4b3c6c16b621ef201a49964 (diff)
downloadframeworks_av-c580c836c1941fb4912e1dd4e08626caf98a62c7.zip
frameworks_av-c580c836c1941fb4912e1dd4e08626caf98a62c7.tar.gz
frameworks_av-c580c836c1941fb4912e1dd4e08626caf98a62c7.tar.bz2
Prevent integer issues in ID3::Iterator::findFrame
Integer overflows could occur a few places within findFrame. These can lead to out-of-bounds reads and potentially infinite loops. Ensure that arithmetic does not wrap around to prevent these behaviors. Bug: 23285192 Change-Id: I72a61df7d5719d1d3f2bd0b37fba86f0f4bbedee
Diffstat (limited to 'media/libstagefright/id3')
-rw-r--r--media/libstagefright/id3/ID3.cpp23
1 files changed, 21 insertions, 2 deletions
diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp
index 751b810..5a490e9 100644
--- a/media/libstagefright/id3/ID3.cpp
+++ b/media/libstagefright/id3/ID3.cpp
@@ -659,6 +659,11 @@ void ID3::Iterator::findFrame() {
mFrameSize += 6;
+ // Prevent integer overflow in validation
+ if (SIZE_MAX - mOffset <= mFrameSize) {
+ return;
+ }
+
if (mOffset + mFrameSize > mParent.mSize) {
ALOGV("partial frame at offset %d (size = %d, bytes-remaining = %d)",
mOffset, mFrameSize, mParent.mSize - mOffset - 6);
@@ -688,7 +693,7 @@ void ID3::Iterator::findFrame() {
return;
}
- size_t baseSize;
+ size_t baseSize = 0;
if (mParent.mVersion == ID3_V2_4) {
if (!ParseSyncsafeInteger(
&mParent.mData[mOffset + 4], &baseSize)) {
@@ -698,7 +703,21 @@ void ID3::Iterator::findFrame() {
baseSize = U32_AT(&mParent.mData[mOffset + 4]);
}
- mFrameSize = 10 + baseSize;
+ if (baseSize == 0) {
+ return;
+ }
+
+ // Prevent integer overflow when adding
+ if (SIZE_MAX - 10 <= baseSize) {
+ return;
+ }
+
+ mFrameSize = 10 + baseSize; // add tag id, size field and flags
+
+ // Prevent integer overflow in validation
+ if (SIZE_MAX - mOffset <= mFrameSize) {
+ return;
+ }
if (mOffset + mFrameSize > mParent.mSize) {
ALOGV("partial frame at offset %d (size = %d, bytes-remaining = %d)",