diff options
| author | Marco Nelissen <marcone@google.com> | 2015-08-07 14:56:01 +0000 | 
|---|---|---|
| committer | Android Git Automerger <android-git-automerger@android.com> | 2015-08-07 14:56:01 +0000 | 
| commit | 0625841daae5bb1351034909ce705aab517eea2d (patch) | |
| tree | 7e77aeb1072938040bab56ba4a9ed6b48c0a8473 | |
| parent | 9f7bceff18052171b3042bda945d7e4e94b60f1c (diff) | |
| parent | dfaea255546340742b42c216663f61c6b7301c4f (diff) | |
| download | frameworks_av-0625841daae5bb1351034909ce705aab517eea2d.zip frameworks_av-0625841daae5bb1351034909ce705aab517eea2d.tar.gz frameworks_av-0625841daae5bb1351034909ce705aab517eea2d.tar.bz2  | |
am dfaea255: am 578d5b66: am 171b5fad: am d6ea7f65: am f26400c9: Fix crash on malformed id3
* commit 'dfaea255546340742b42c216663f61c6b7301c4f':
  Fix crash on malformed id3
| -rw-r--r-- | include/media/stagefright/MetaData.h | 2 | ||||
| -rw-r--r-- | media/libstagefright/MetaData.cpp | 32 | ||||
| -rw-r--r-- | media/libstagefright/id3/ID3.cpp | 6 | 
3 files changed, 27 insertions, 13 deletions
diff --git a/include/media/stagefright/MetaData.h b/include/media/stagefright/MetaData.h index 087d016..3f42790 100644 --- a/include/media/stagefright/MetaData.h +++ b/include/media/stagefright/MetaData.h @@ -260,7 +260,7 @@ private:              return mSize <= sizeof(u.reservoir);          } -        void allocateStorage(size_t size); +        void *allocateStorage(size_t size);          void freeStorage();          void *storage() { diff --git a/media/libstagefright/MetaData.cpp b/media/libstagefright/MetaData.cpp index 7d867b7..1a11c1e 100644 --- a/media/libstagefright/MetaData.cpp +++ b/media/libstagefright/MetaData.cpp @@ -244,8 +244,11 @@ MetaData::typed_data::~typed_data() {  MetaData::typed_data::typed_data(const typed_data &from)      : mType(from.mType),        mSize(0) { -    allocateStorage(from.mSize); -    memcpy(storage(), from.storage(), mSize); + +    void *dst = allocateStorage(from.mSize); +    if (dst) { +        memcpy(dst, from.storage(), mSize); +    }  }  MetaData::typed_data &MetaData::typed_data::operator=( @@ -253,8 +256,10 @@ MetaData::typed_data &MetaData::typed_data::operator=(      if (this != &from) {          clear();          mType = from.mType; -        allocateStorage(from.mSize); -        memcpy(storage(), from.storage(), mSize); +        void *dst = allocateStorage(from.mSize); +        if (dst) { +            memcpy(dst, from.storage(), mSize); +        }      }      return *this; @@ -271,13 +276,11 @@ void MetaData::typed_data::setData(      clear();      mType = type; -    allocateStorage(size); -    void *dst = storage(); -    if (!dst) { -        ALOGE("Couldn't allocate %zu bytes for item", size); -        return; + +    void *dst = allocateStorage(size); +    if (dst) { +        memcpy(dst, data, size);      } -    memcpy(dst, data, size);  }  void MetaData::typed_data::getData( @@ -287,14 +290,19 @@ void MetaData::typed_data::getData(      *data = storage();  } -void MetaData::typed_data::allocateStorage(size_t size) { +void *MetaData::typed_data::allocateStorage(size_t size) {      mSize = size;      if (usesReservoir()) { -        return; +        return &u.reservoir;      }      u.ext_data = malloc(mSize); +    if (u.ext_data == NULL) { +        ALOGE("Couldn't allocate %zu bytes for item", size); +        mSize = 0; +    } +    return u.ext_data;  }  void MetaData::typed_data::freeStorage() { diff --git a/media/libstagefright/id3/ID3.cpp b/media/libstagefright/id3/ID3.cpp index 7f221a0..3ef175b 100644 --- a/media/libstagefright/id3/ID3.cpp +++ b/media/libstagefright/id3/ID3.cpp @@ -804,6 +804,12 @@ ID3::getAlbumArt(size_t *length, String8 *mime) const {              size_t descLen = StringSize(&data[2 + mimeLen], encoding); +            if (size < 2 || +                    size - 2 < mimeLen || +                    size - 2 - mimeLen < descLen) { +                ALOGW("bogus album art sizes"); +                return NULL; +            }              *length = size - 2 - mimeLen - descLen;              return &data[2 + mimeLen + descLen];  | 
