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

Commit c7b71a1b authored by Eric Laurent's avatar Eric Laurent
Browse files

audio flinger: move record permission checks to audio policy service

Move audio permission checks to getInputForAttr and startInput.

Test: AudioRecord CTS tests. Manual test of capture use cases.
Change-Id: Ifaefc1198248b46fc59aecd6c9ec3aa892656e05
parent 0f4b3c54
Loading
Loading
Loading
Loading
+0 −6
Original line number Original line Diff line number Diff line
@@ -1622,12 +1622,6 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu
        clientPid = callingPid;
        clientPid = callingPid;
    }
    }


    // check calling permissions
    if (!recordingAllowed(input.opPackageName, input.clientInfo.clientTid, clientUid)) {
        ALOGE("createRecord() permission denied: recording not allowed");
        lStatus = PERMISSION_DENIED;
        goto Exit;
    }
    // we don't yet support anything other than linear PCM
    // we don't yet support anything other than linear PCM
    if (!audio_is_valid_format(input.config.format) || !audio_is_linear_pcm(input.config.format)) {
    if (!audio_is_valid_format(input.config.format) || !audio_is_linear_pcm(input.config.format)) {
        ALOGE("createRecord() invalid format %#x", input.config.format);
        ALOGE("createRecord() invalid format %#x", input.config.format);
+0 −4
Original line number Original line Diff line number Diff line
@@ -7801,10 +7801,6 @@ status_t AudioFlinger::MmapThread::start(const AudioClient& client,
        return NO_ERROR;
        return NO_ERROR;
    }
    }


    if (!isOutput() && !recordingAllowed(client.packageName, client.clientPid, client.clientUid)) {
        return PERMISSION_DENIED;
    }

    audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;
    audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE;


    audio_io_handle_t io = mId;
    audio_io_handle_t io = mId;
+23 −5
Original line number Original line Diff line number Diff line
@@ -296,6 +296,7 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
    if (mAudioPolicyManager == NULL) {
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
        return NO_INIT;
    }
    }

    // already checked by client, but double-check in case the client wrapper is bypassed
    // already checked by client, but double-check in case the client wrapper is bypassed
    if (attr->source < AUDIO_SOURCE_DEFAULT && attr->source >= AUDIO_SOURCE_CNT &&
    if (attr->source < AUDIO_SOURCE_DEFAULT && attr->source >= AUDIO_SOURCE_CNT &&
            attr->source != AUDIO_SOURCE_HOTWORD && attr->source != AUDIO_SOURCE_FM_TUNER) {
            attr->source != AUDIO_SOURCE_HOTWORD && attr->source != AUDIO_SOURCE_FM_TUNER) {
@@ -319,6 +320,13 @@ status_t AudioPolicyService::getInputForAttr(const audio_attributes_t *attr,
        pid = callingPid;
        pid = callingPid;
    }
    }


    // check calling permissions
    if (!recordingAllowed(opPackageName, pid, uid)) {
        ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
                __func__, uid, pid);
        return PERMISSION_DENIED;
    }

    if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed(pid, uid)) {
    if ((attr->source == AUDIO_SOURCE_HOTWORD) && !captureHotwordAllowed(pid, uid)) {
        return BAD_VALUE;
        return BAD_VALUE;
    }
    }
@@ -392,18 +400,28 @@ status_t AudioPolicyService::startInput(audio_port_handle_t portId, bool *silenc
    if (mAudioPolicyManager == NULL) {
    if (mAudioPolicyManager == NULL) {
        return NO_INIT;
        return NO_INIT;
    }
    }

    sp<AudioRecordClient> client;
    {
        Mutex::Autolock _l(mLock);
        Mutex::Autolock _l(mLock);


        ssize_t index = mAudioRecordClients.indexOfKey(portId);
        ssize_t index = mAudioRecordClients.indexOfKey(portId);
        if (index < 0) {
        if (index < 0) {
            return INVALID_OPERATION;
            return INVALID_OPERATION;
        }
        }
    sp<AudioRecordClient> client = mAudioRecordClients.valueAt(index);
        client = mAudioRecordClients.valueAt(index);
    }

    // check calling permissions
    if (!recordingAllowed(client->opPackageName, client->pid, client->uid)) {
        ALOGE("%s permission denied: recording not allowed for uid %d pid %d",
                __func__, client->uid, client->pid);
        return PERMISSION_DENIED;
    }


    // If UID inactive it records silence until becoming active
    // If UID inactive it records silence until becoming active
    *silenced = !mUidPolicy->isUidActive(client->uid) && !client->isVirtualDevice;
    *silenced = !mUidPolicy->isUidActive(client->uid) && !client->isVirtualDevice;


    Mutex::Autolock _l(mLock);
    AudioPolicyInterface::concurrency_type__mask_t concurrency =
    AudioPolicyInterface::concurrency_type__mask_t concurrency =
            AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE;
            AudioPolicyInterface::API_INPUT_CONCURRENCY_NONE;