FLACExtractor: copy protect mWriteBuffer Bug: 30895578 Bug: 34970788 Change-Id: I4cba36bbe3502678210e5925181683df9726b431 (cherry picked from commit 328cd66cc72ba7bc5452ed5a93f29ddcd73aa9f9) (cherry picked from commit 8ee699977c155c6d67e4abd8b4259b5447148a80)
diff --git a/media/libstagefright/FLACExtractor.cpp b/media/libstagefright/FLACExtractor.cpp index 13b66f3..543e0af 100644 --- a/media/libstagefright/FLACExtractor.cpp +++ b/media/libstagefright/FLACExtractor.cpp
@@ -73,6 +73,10 @@ class FLACParser : public RefBase { public: + enum { + kMaxChannels = 8, + }; + FLACParser( const sp<DataSource> &dataSource, // If metadata pointers aren't provided, we don't fill them @@ -122,7 +126,7 @@ // media buffers size_t mMaxBufferSize; MediaBufferGroup *mGroup; - void (*mCopy)(short *dst, const int *const *src, unsigned nSamples, unsigned nChannels); + void (*mCopy)(short *dst, const int * src[kMaxChannels], unsigned nSamples, unsigned nChannels); // handle to underlying libFLAC parser FLAC__StreamDecoder *mDecoder; @@ -139,7 +143,7 @@ bool mWriteRequested; bool mWriteCompleted; FLAC__FrameHeader mWriteHeader; - const FLAC__int32 * const *mWriteBuffer; + FLAC__int32 const * mWriteBuffer[kMaxChannels]; // most recent error reported by libFLAC parser FLAC__StreamDecoderErrorStatus mErrorStatus; @@ -323,7 +327,7 @@ mWriteRequested = false; // FLAC parser doesn't free or realloc buffer until next frame or finish mWriteHeader = frame->header; - mWriteBuffer = buffer; + memmove(mWriteBuffer, buffer, sizeof(const FLAC__int32 * const) * getChannels()); mWriteCompleted = true; return FLAC__STREAM_DECODER_WRITE_STATUS_CONTINUE; } else { @@ -382,7 +386,7 @@ static void copyMono8( short *dst, - const int *const *src, + const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned /* nChannels */) { for (unsigned i = 0; i < nSamples; ++i) { @@ -392,7 +396,7 @@ static void copyStereo8( short *dst, - const int *const *src, + const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned /* nChannels */) { for (unsigned i = 0; i < nSamples; ++i) { @@ -401,7 +405,7 @@ } } -static void copyMultiCh8(short *dst, const int *const *src, unsigned nSamples, unsigned nChannels) +static void copyMultiCh8(short *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels) { for (unsigned i = 0; i < nSamples; ++i) { for (unsigned c = 0; c < nChannels; ++c) { @@ -412,7 +416,7 @@ static void copyMono16( short *dst, - const int *const *src, + const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned /* nChannels */) { for (unsigned i = 0; i < nSamples; ++i) { @@ -422,7 +426,7 @@ static void copyStereo16( short *dst, - const int *const *src, + const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned /* nChannels */) { for (unsigned i = 0; i < nSamples; ++i) { @@ -431,7 +435,7 @@ } } -static void copyMultiCh16(short *dst, const int *const *src, unsigned nSamples, unsigned nChannels) +static void copyMultiCh16(short *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels) { for (unsigned i = 0; i < nSamples; ++i) { for (unsigned c = 0; c < nChannels; ++c) { @@ -444,7 +448,7 @@ static void copyMono24( short *dst, - const int *const *src, + const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned /* nChannels */) { for (unsigned i = 0; i < nSamples; ++i) { @@ -454,7 +458,7 @@ static void copyStereo24( short *dst, - const int *const *src, + const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned /* nChannels */) { for (unsigned i = 0; i < nSamples; ++i) { @@ -463,7 +467,7 @@ } } -static void copyMultiCh24(short *dst, const int *const *src, unsigned nSamples, unsigned nChannels) +static void copyMultiCh24(short *dst, const int * src[FLACParser::kMaxChannels], unsigned nSamples, unsigned nChannels) { for (unsigned i = 0; i < nSamples; ++i) { for (unsigned c = 0; c < nChannels; ++c) { @@ -474,7 +478,7 @@ static void copyTrespass( short * /* dst */, - const int *const * /* src */, + const int *[FLACParser::kMaxChannels] /* src */, unsigned /* nSamples */, unsigned /* nChannels */) { TRESPASS(); @@ -499,7 +503,6 @@ mStreamInfoValid(false), mWriteRequested(false), mWriteCompleted(false), - mWriteBuffer(NULL), mErrorStatus((FLAC__StreamDecoderErrorStatus) -1) { ALOGV("FLACParser::FLACParser"); @@ -555,7 +558,7 @@ } if (mStreamInfoValid) { // check channel count - if (getChannels() == 0 || getChannels() > 8) { + if (getChannels() == 0 || getChannels() > kMaxChannels) { ALOGE("unsupported channel count %u", getChannels()); return NO_INIT; } @@ -591,7 +594,7 @@ static const struct { unsigned mChannels; unsigned mBitsPerSample; - void (*mCopy)(short *dst, const int *const *src, unsigned nSamples, unsigned nChannels); + void (*mCopy)(short *dst, const int * src[kMaxChannels], unsigned nSamples, unsigned nChannels); } table[] = { { 1, 8, copyMono8 }, { 2, 8, copyStereo8 },