diff options
author | Wonsik Kim <wonsik@google.com> | 2015-09-08 17:32:28 +0900 |
---|---|---|
committer | Wonsik Kim <wonsik@google.com> | 2015-09-09 13:58:29 +0900 |
commit | 316c3d929ffb004b0150d515e82aede02208ce97 (patch) | |
tree | cc281ba1a211e352d0e40e980c4d911d5a22f805 /media/libstagefright/NuCachedSource2.cpp | |
parent | 35e03636d6fa0c7c33c67e10686657849a61aff8 (diff) | |
download | frameworks_av-316c3d929ffb004b0150d515e82aede02208ce97.zip frameworks_av-316c3d929ffb004b0150d515e82aede02208ce97.tar.gz frameworks_av-316c3d929ffb004b0150d515e82aede02208ce97.tar.bz2 |
NuCachedSource2: fix possible erroneous early free
Because the constructor of NuCachedSource2 sent a message to
AHandlerReflector object, AHandlerReflector::onMessageReceived could
have executed just before the object gets wrapped in a strong
pointer, resulting in erroneous early free. Fix the issue by using
static Create function to ensure the message is sent after the
object is wrapped in a sp.
Bug: 23882800
Change-Id: I38a9d7a3083f184b4c81d0b00ba1661721278855
Diffstat (limited to 'media/libstagefright/NuCachedSource2.cpp')
-rw-r--r-- | media/libstagefright/NuCachedSource2.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/media/libstagefright/NuCachedSource2.cpp b/media/libstagefright/NuCachedSource2.cpp index f82636b..d6255d6 100644 --- a/media/libstagefright/NuCachedSource2.cpp +++ b/media/libstagefright/NuCachedSource2.cpp @@ -224,9 +224,6 @@ NuCachedSource2::NuCachedSource2( // So whenever we call DataSource::readAt it may end up in a call to // IMediaHTTPConnection::readAt and therefore call back into JAVA. mLooper->start(false /* runOnCallingThread */, true /* canCallJava */); - - Mutex::Autolock autoLock(mLock); - (new AMessage(kWhatFetchMore, mReflector))->post(); } NuCachedSource2::~NuCachedSource2() { @@ -237,6 +234,18 @@ NuCachedSource2::~NuCachedSource2() { mCache = NULL; } +// static +sp<NuCachedSource2> NuCachedSource2::Create( + const sp<DataSource> &source, + const char *cacheConfig, + bool disconnectAtHighwatermark) { + sp<NuCachedSource2> instance = new NuCachedSource2( + source, cacheConfig, disconnectAtHighwatermark); + Mutex::Autolock autoLock(instance->mLock); + (new AMessage(kWhatFetchMore, instance->mReflector))->post(); + return instance; +} + status_t NuCachedSource2::getEstimatedBandwidthKbps(int32_t *kbps) { if (mSource->flags() & kIsHTTPBasedSource) { HTTPBase* source = static_cast<HTTPBase *>(mSource.get()); |