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

Commit 3b50c321 authored by Eric Laurent's avatar Eric Laurent Committed by android-build-merger
Browse files

DO NOT MERGE - audioflinger: fix recursive mutex lock in EffectHandle. am:...

DO NOT MERGE - audioflinger: fix recursive mutex lock in EffectHandle. am: 31a4598a am: bc9bdb3b
am: ef4c260b

Change-Id: Ic3389dc9b6b3c19eb891c2ad5872330adb97176a
parents 1b551634 ef4c260b
Loading
Loading
Loading
Loading
+25 −7
Original line number Diff line number Diff line
@@ -1311,6 +1311,24 @@ status_t AudioFlinger::EffectHandle::command(uint32_t cmdCode,
    ALOGVV("command(), cmdCode: %d, mHasControl: %d, mEffect: %p",
            cmdCode, mHasControl, mEffect.unsafe_get());

    if (cmdCode == EFFECT_CMD_ENABLE) {
        if (*replySize < sizeof(int)) {
            android_errorWriteLog(0x534e4554, "32095713");
            return BAD_VALUE;
        }
        *(int *)pReplyData = NO_ERROR;
        *replySize = sizeof(int);
        return enable();
    } else if (cmdCode == EFFECT_CMD_DISABLE) {
        if (*replySize < sizeof(int)) {
            android_errorWriteLog(0x534e4554, "32095713");
            return BAD_VALUE;
        }
        *(int *)pReplyData = NO_ERROR;
        *replySize = sizeof(int);
        return disable();
    }

    AutoMutex _l(mLock);
    sp<EffectModule> effect = mEffect.promote();
    if (effect == 0 || mDisconnected) {
@@ -1326,11 +1344,17 @@ status_t AudioFlinger::EffectHandle::command(uint32_t cmdCode,

    // handle commands that are not forwarded transparently to effect engine
    if (cmdCode == EFFECT_CMD_SET_PARAM_COMMIT) {
        if (*replySize < sizeof(int)) {
            android_errorWriteLog(0x534e4554, "32095713");
            return BAD_VALUE;
        }
        *(int *)pReplyData = NO_ERROR;
        *replySize = sizeof(int);

        // No need to trylock() here as this function is executed in the binder thread serving a
        // particular client process:  no risk to block the whole media server process or mixer
        // threads if we are stuck here
        Mutex::Autolock _l(mCblk->lock);

        // keep local copy of index in case of client corruption b/32220769
        const uint32_t clientIndex = mCblk->clientIndex;
        const uint32_t serverIndex = mCblk->serverIndex;
@@ -1393,12 +1417,6 @@ status_t AudioFlinger::EffectHandle::command(uint32_t cmdCode,
        mCblk->serverIndex = 0;
        mCblk->clientIndex = 0;
        return status;
    } else if (cmdCode == EFFECT_CMD_ENABLE) {
        *(int *)pReplyData = NO_ERROR;
        return enable();
    } else if (cmdCode == EFFECT_CMD_DISABLE) {
        *(int *)pReplyData = NO_ERROR;
        return disable();
    }

    return effect->command(cmdCode, cmdSize, pCmdData, replySize, pReplyData);