Prevent MediaPlayerService::Client's use-after-free
Test: make cts -j123 && cts-tradefed run cts-dev -m \
CtsMediaTestCases --compatibility:module-arg \
CtsMediaTestCases:include-annotation:\
android.platform.test.annotations.RequiresDevice
Bug: 70546581
Change-Id: Ia142a7735c6685eb67b2c00917c0ed5ea7e0da9e
diff --git a/media/libmediaplayerservice/include/MediaPlayerInterface.h b/media/libmediaplayerservice/include/MediaPlayerInterface.h
index a03884f..4b33e61 100644
--- a/media/libmediaplayerservice/include/MediaPlayerInterface.h
+++ b/media/libmediaplayerservice/include/MediaPlayerInterface.h
@@ -67,7 +67,7 @@
#define AUDIO_SINK_MIN_DEEP_BUFFER_DURATION_US 5000000
// callback mechanism for passing messages to MediaPlayer object
-typedef void (*notify_callback_f)(void* cookie,
+typedef void (*notify_callback_f)(const wp<IMediaPlayer> &listener,
int msg, int ext1, int ext2, const Parcel *obj);
// abstract base class - use MediaPlayerInterface
@@ -157,7 +157,7 @@
virtual status_t enableAudioDeviceCallback(bool enabled);
};
- MediaPlayerBase() : mCookie(0), mNotify(0) {}
+ MediaPlayerBase() : mClient(0), mNotify(0) {}
virtual ~MediaPlayerBase() {}
virtual status_t initCheck() = 0;
virtual bool hardwareOutput() = 0;
@@ -271,22 +271,22 @@
};
void setNotifyCallback(
- void* cookie, notify_callback_f notifyFunc) {
+ const wp<IMediaPlayer> &client, notify_callback_f notifyFunc) {
Mutex::Autolock autoLock(mNotifyLock);
- mCookie = cookie; mNotify = notifyFunc;
+ mClient = client; mNotify = notifyFunc;
}
void sendEvent(int msg, int ext1=0, int ext2=0,
const Parcel *obj=NULL) {
notify_callback_f notifyCB;
- void* cookie;
+ wp<IMediaPlayer> client;
{
Mutex::Autolock autoLock(mNotifyLock);
notifyCB = mNotify;
- cookie = mCookie;
+ client = mClient;
}
- if (notifyCB) notifyCB(cookie, msg, ext1, ext2, obj);
+ if (notifyCB) notifyCB(client, msg, ext1, ext2, obj);
}
virtual status_t dump(int /* fd */, const Vector<String16>& /* args */) const {
@@ -305,7 +305,7 @@
friend class MediaPlayerService;
Mutex mNotifyLock;
- void* mCookie;
+ wp<IMediaPlayer> mClient;
notify_callback_f mNotify;
};