From 5a4001ddb2536d65d966970fc0579bf6bd11b5a0 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Wed, 26 May 2010 12:59:06 -0700 Subject: Convert a number of assertions into runtime errors (OggExtractor) Change-Id: I8fcaec927d7b72e9d61cb7283e54523711980268 --- media/libstagefright/OggExtractor.cpp | 66 ++++++++++++++++++++++++----------- 1 file changed, 46 insertions(+), 20 deletions(-) (limited to 'media/libstagefright/OggExtractor.cpp') diff --git a/media/libstagefright/OggExtractor.cpp b/media/libstagefright/OggExtractor.cpp index bd16db9..6013b6f 100644 --- a/media/libstagefright/OggExtractor.cpp +++ b/media/libstagefright/OggExtractor.cpp @@ -76,7 +76,7 @@ struct MyVorbisExtractor { status_t seekToOffset(off_t offset); status_t readNextPacket(MediaBuffer **buffer); - void init(); + status_t init(); sp getFileMetaData() { return mFileMeta; } @@ -107,7 +107,7 @@ private: ssize_t readPage(off_t offset, Page *page); status_t findNextPage(off_t startOffset, off_t *pageOffset); - void verifyHeader( + status_t verifyHeader( MediaBuffer *buffer, uint8_t type); void parseFileMetaData(); @@ -308,6 +308,7 @@ ssize_t MyVorbisExtractor::readPage(off_t offset, Page *page) { totalSize += page->mLace[i]; } +#if 0 String8 tmp; for (size_t i = 0; i < page->mNumSegments; ++i) { char x[32]; @@ -316,7 +317,8 @@ ssize_t MyVorbisExtractor::readPage(off_t offset, Page *page) { tmp.append(x); } - // LOGV("%c %s", page->mFlags & 1 ? '+' : ' ', tmp.string()); + LOGV("%c %s", page->mFlags & 1 ? '+' : ' ', tmp.string()); +#endif return sizeof(header) + page->mNumSegments + totalSize; } @@ -432,43 +434,60 @@ status_t MyVorbisExtractor::readNextPacket(MediaBuffer **out) { } } -void MyVorbisExtractor::init() { +status_t MyVorbisExtractor::init() { mMeta = new MetaData; mMeta->setCString(kKeyMIMEType, MEDIA_MIMETYPE_AUDIO_VORBIS); MediaBuffer *packet; - CHECK_EQ(readNextPacket(&packet), OK); + status_t err; + if ((err = readNextPacket(&packet)) != OK) { + return err; + } LOGV("read packet of size %d\n", packet->range_length()); - verifyHeader(packet, 1); + err = verifyHeader(packet, 1); packet->release(); packet = NULL; + if (err != OK) { + return err; + } - CHECK_EQ(readNextPacket(&packet), OK); + if ((err = readNextPacket(&packet)) != OK) { + return err; + } LOGV("read packet of size %d\n", packet->range_length()); - verifyHeader(packet, 3); + err = verifyHeader(packet, 3); packet->release(); packet = NULL; + if (err != OK) { + return err; + } - CHECK_EQ(readNextPacket(&packet), OK); + if ((err = readNextPacket(&packet)) != OK) { + return err; + } LOGV("read packet of size %d\n", packet->range_length()); - verifyHeader(packet, 5); + err = verifyHeader(packet, 5); packet->release(); packet = NULL; + if (err != OK) { + return err; + } mFirstDataOffset = mOffset + mCurrentPageSize; + + return OK; } -void MyVorbisExtractor::verifyHeader( +status_t MyVorbisExtractor::verifyHeader( MediaBuffer *buffer, uint8_t type) { const uint8_t *data = (const uint8_t *)buffer->data() + buffer->range_offset(); size_t size = buffer->range_length(); - CHECK(size >= 7); - - CHECK_EQ(data[0], type); - CHECK(!memcmp(&data[1], "vorbis", 6)); + if (size < 7 || data[0] != type || memcmp(&data[1], "vorbis", 6)) { + return ERROR_MALFORMED; + } ogg_buffer buf; buf.data = (uint8_t *)data; @@ -515,7 +534,9 @@ void MyVorbisExtractor::verifyHeader( case 3: { - CHECK_EQ(0, _vorbis_unpack_comment(&mVc, &bits)); + if (0 != _vorbis_unpack_comment(&mVc, &bits)) { + return ERROR_MALFORMED; + } parseFileMetaData(); break; @@ -523,12 +544,16 @@ void MyVorbisExtractor::verifyHeader( case 5: { - CHECK_EQ(0, _vorbis_unpack_books(&mVi, &bits)); + if (0 != _vorbis_unpack_books(&mVi, &bits)) { + return ERROR_MALFORMED; + } mMeta->setData(kKeyVorbisBooks, 0, data, size); break; } } + + return OK; } uint64_t MyVorbisExtractor::approxBitrate() { @@ -732,10 +757,11 @@ OggExtractor::OggExtractor(const sp &source) mInitCheck(NO_INIT), mImpl(NULL) { mImpl = new MyVorbisExtractor(mDataSource); - CHECK_EQ(mImpl->seekToOffset(0), OK); - mImpl->init(); + mInitCheck = mImpl->seekToOffset(0); - mInitCheck = OK; + if (mInitCheck == OK) { + mInitCheck = mImpl->init(); + } } OggExtractor::~OggExtractor() { -- cgit v1.1