summaryrefslogtreecommitdiffstats
path: root/media
diff options
context:
space:
mode:
authorFlanker <i@flanker017.me>2015-09-29 06:27:21 +0000
committerAndroid Git Automerger <android-git-automerger@android.com>2015-09-29 06:27:21 +0000
commit5226d6b7b0fbe40ed1450f6a9d2567aa513e8d79 (patch)
tree152180658b81d98d83d4012da2c654ab4b69d31a /media
parent925042742d4ebc69fa2bd7829e80e2ec306b87f3 (diff)
parente64d4870a543803d8172b80ad8eb198dfde6f361 (diff)
downloadframeworks_av-5226d6b7b0fbe40ed1450f6a9d2567aa513e8d79.zip
frameworks_av-5226d6b7b0fbe40ed1450f6a9d2567aa513e8d79.tar.gz
frameworks_av-5226d6b7b0fbe40ed1450f6a9d2567aa513e8d79.tar.bz2
am e64d4870: am 2b8cd9cb: stagefright: fix AMessage::FromParcel
* commit 'e64d4870a543803d8172b80ad8eb198dfde6f361': stagefright: fix AMessage::FromParcel
Diffstat (limited to 'media')
-rw-r--r--media/libstagefright/foundation/AMessage.cpp28
1 files changed, 25 insertions, 3 deletions
diff --git a/media/libstagefright/foundation/AMessage.cpp b/media/libstagefright/foundation/AMessage.cpp
index 795e8a6..26bea2c 100644
--- a/media/libstagefright/foundation/AMessage.cpp
+++ b/media/libstagefright/foundation/AMessage.cpp
@@ -535,13 +535,24 @@ sp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
sp<AMessage> msg = new AMessage(what);
msg->mNumItems = static_cast<size_t>(parcel.readInt32());
+ if (msg->mNumItems > kMaxNumItems) {
+ ALOGE("Too large number of items clipped.");
+ msg->mNumItems = kMaxNumItems;
+ }
+
for (size_t i = 0; i < msg->mNumItems; ++i) {
Item *item = &msg->mItems[i];
const char *name = parcel.readCString();
- item->setName(name, strlen(name));
- item->mType = static_cast<Type>(parcel.readInt32());
+ if (name == NULL) {
+ ALOGE("Failed reading name for an item. Parsing aborted.");
+ msg->mNumItems = i;
+ break;
+ }
+ item->mType = static_cast<Type>(parcel.readInt32());
+ // setName() happens below so that we don't leak memory when parsing
+ // is aborted in the middle.
switch (item->mType) {
case kTypeInt32:
{
@@ -575,7 +586,16 @@ sp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
case kTypeString:
{
- item->u.stringValue = new AString(parcel.readCString());
+ const char *stringValue = parcel.readCString();
+ if (stringValue == NULL) {
+ ALOGE("Failed reading string value from a parcel. "
+ "Parsing aborted.");
+ msg->mNumItems = i;
+ continue;
+ // The loop will terminate subsequently.
+ } else {
+ item->u.stringValue = new AString(stringValue);
+ }
break;
}
@@ -594,6 +614,8 @@ sp<AMessage> AMessage::FromParcel(const Parcel &parcel) {
TRESPASS();
}
}
+
+ item->setName(name, strlen(name));
}
return msg;