Skip to content
Permalink
Browse files

DO NOT MERGE 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
(cherry picked from commit c894f81)
  • Loading branch information...
Wonsik Kim authored and andi34 committed Sep 8, 2015
1 parent 63f26e4 commit 0702359ad90a8193602519e9916aad04b1bcbe2a
@@ -2218,11 +2218,11 @@ status_t AwesomePlayer::finishSetDataSource_l() {
// The widevine extractor does its own caching.

#if 0
mCachedSource = new NuCachedSource2(
mCachedSource = NuCachedSource2::Create(
new ThrottledSource(
mConnectingDataSource, 50 * 1024 /* bytes/sec */));
#else
mCachedSource = new NuCachedSource2(
mCachedSource = NuCachedSource2::Create(
mConnectingDataSource,
cacheConfig.isEmpty() ? NULL : cacheConfig.string(),
disconnectAtHighwatermark);
@@ -212,7 +212,7 @@ sp<DataSource> DataSource::CreateFromURI(
&copy, &cacheConfig, &disconnectAtHighwatermark);
}

source = new NuCachedSource2(
source = NuCachedSource2::Create(
httpSource,
cacheConfig.isEmpty() ? NULL : cacheConfig.string());
} else {
@@ -214,9 +214,6 @@ NuCachedSource2::NuCachedSource2(
mLooper->setName("NuCachedSource2");
mLooper->registerHandler(mReflector);
mLooper->start();

Mutex::Autolock autoLock(mLock);
(new AMessage(kWhatFetchMore, mReflector->id()))->post();
}

NuCachedSource2::~NuCachedSource2() {
@@ -227,6 +224,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->id()))->post();
return instance;
}

status_t NuCachedSource2::getEstimatedBandwidthKbps(int32_t *kbps) {
if (mSource->flags() & kIsHTTPBasedSource) {
HTTPBase* source = static_cast<HTTPBase *>(mSource.get());
@@ -28,7 +28,7 @@ struct ALooper;
struct PageCache;

struct NuCachedSource2 : public DataSource {
NuCachedSource2(
static sp<NuCachedSource2> Create(
const sp<DataSource> &source,
const char *cacheConfig = NULL,
bool disconnectAtHighwatermark = false);
@@ -70,6 +70,11 @@ struct NuCachedSource2 : public DataSource {
private:
friend struct AHandlerReflector<NuCachedSource2>;

NuCachedSource2(
const sp<DataSource> &source,
const char *cacheConfig,
bool disconnectAtHighwatermark);

enum {
kPageSize = 65536,
kDefaultHighWaterThreshold = 20 * 1024 * 1024,

0 comments on commit 0702359

Please sign in to comment.
You can’t perform that action at this time.