Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b8a9825b authored by James Dong's avatar James Dong
Browse files

Fixed a potential/rare race condtion in MediaPlayerService::Client::notify() method

o The mClient could be disconnected before the notify message is sent out. Use
  a local reference could help resolve this issue.

o related-to-bug: 6782035

Change-Id: Ia2047bd7f2666100fed83c6e5417a3bf2e20cd2c
parent 96272d57
Loading
Loading
Loading
Loading
+10 −2
Original line number Original line Diff line number Diff line
@@ -1042,9 +1042,14 @@ void MediaPlayerService::Client::notify(
        void* cookie, int msg, int ext1, int ext2, const Parcel *obj)
        void* cookie, int msg, int ext1, int ext2, const Parcel *obj)
{
{
    Client* client = static_cast<Client*>(cookie);
    Client* client = static_cast<Client*>(cookie);
    if (client == NULL) {
        return;
    }


    sp<IMediaPlayerClient> c;
    {
    {
        Mutex::Autolock l(client->mLock);
        Mutex::Autolock l(client->mLock);
        c = client->mClient;
        if (msg == MEDIA_PLAYBACK_COMPLETE && client->mNextClient != NULL) {
        if (msg == MEDIA_PLAYBACK_COMPLETE && client->mNextClient != NULL) {
            if (client->mAudioOutput != NULL)
            if (client->mAudioOutput != NULL)
                client->mAudioOutput->switchToNextOutput();
                client->mAudioOutput->switchToNextOutput();
@@ -1065,8 +1070,11 @@ void MediaPlayerService::Client::notify(
        // also access mMetadataUpdated and clears it.
        // also access mMetadataUpdated and clears it.
        client->addNewMetadataUpdate(metadata_type);
        client->addNewMetadataUpdate(metadata_type);
    }
    }

    if (c != NULL) {
        ALOGV("[%d] notify (%p, %d, %d, %d)", client->mConnId, cookie, msg, ext1, ext2);
        ALOGV("[%d] notify (%p, %d, %d, %d)", client->mConnId, cookie, msg, ext1, ext2);
    client->mClient->notify(msg, ext1, ext2, obj);
        c->notify(msg, ext1, ext2, obj);
    }
}
}