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

Commit c62c9327 authored by Eric Laurent's avatar Eric Laurent Committed by Cherrypicker Worker
Browse files

audiopolicy: avoid binder calls to system server with mutex held

Do not call mustAnonymizeBluetoothAddress() (which in turn uses binder
calls to system server (for permission checks...) with the audio policy
service mutex held. This can cause the system server binder queue to be
exhausted if other transactions to java AudioService are waiting on a
mutex held while calling into native audio policy service.

Bug: 303552947
Fixes: 329911862
Test: make
(cherry picked from https://googleplex-android-review.googlesource.com/q/commit:db0ec96c4013068be846cda345adad581076087f)
Merged-In: Id602be8600040077c7db26f1a9a0b8948ee1bc5c
Change-Id: Id602be8600040077c7db26f1a9a0b8948ee1bc5c
parent b598f23a
Loading
Loading
Loading
Loading
+34 −24
Original line number Diff line number Diff line
@@ -1561,17 +1561,20 @@ Status AudioPolicyService::listAudioPorts(media::AudioPortRole roleAidl,
    std::unique_ptr<audio_port_v7[]> ports(new audio_port_v7[num_ports]);
    unsigned int generation;

    const AttributionSourceState attributionSource = getCallingAttributionSource();
    AutoCallerClear acc;
    {
        audio_utils::lock_guard _l(mMutex);
        if (mAudioPolicyManager == NULL) {
            return binderStatusFromStatusT(NO_INIT);
        }

    const AttributionSourceState attributionSource = getCallingAttributionSource();

    AutoCallerClear acc;
        // AudioPolicyManager->listAudioPorts makes a deep copy of port structs into ports
        // so it is safe to access after releasing the mutex
        RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
            mAudioPolicyManager->listAudioPorts(role, type, &num_ports, ports.get(), &generation)));
                mAudioPolicyManager->listAudioPorts(
                        role, type, &num_ports, ports.get(), &generation)));
        numPortsReq = std::min(numPortsReq, num_ports);
    }

    if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
        for (size_t i = 0; i < numPortsReq; ++i) {
@@ -1601,15 +1604,19 @@ Status AudioPolicyService::listDeclaredDevicePorts(media::AudioPortRole role,
Status AudioPolicyService::getAudioPort(int portId,
                                        media::AudioPortFw* _aidl_return) {
    audio_port_v7 port{ .id = portId };

    const AttributionSourceState attributionSource = getCallingAttributionSource();
    AutoCallerClear acc;

    {
        audio_utils::lock_guard _l(mMutex);
        if (mAudioPolicyManager == NULL) {
            return binderStatusFromStatusT(NO_INIT);
        }

    const AttributionSourceState attributionSource = getCallingAttributionSource();

    AutoCallerClear acc;
        // AudioPolicyManager->getAudioPort makes a deep copy of the port struct into port
        // so it is safe to access after releasing the mutex
        RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(mAudioPolicyManager->getAudioPort(&port)));
    }

    if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
        anonymizePortBluetoothAddress(&port);
@@ -1672,17 +1679,20 @@ Status AudioPolicyService::listAudioPatches(Int* count,
    std::unique_ptr<audio_patch[]> patches(new audio_patch[num_patches]);
    unsigned int generation;

    const AttributionSourceState attributionSource = getCallingAttributionSource();
    AutoCallerClear acc;

    {
        audio_utils::lock_guard _l(mMutex);
        if (mAudioPolicyManager == NULL) {
            return binderStatusFromStatusT(NO_INIT);
        }

    const AttributionSourceState attributionSource = getCallingAttributionSource();

    AutoCallerClear acc;
        // AudioPolicyManager->listAudioPatches makes a deep copy of patches structs into patches
        // so it is safe to access after releasing the mutex
        RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(
                mAudioPolicyManager->listAudioPatches(&num_patches, patches.get(), &generation)));
        numPatchesReq = std::min(numPatchesReq, num_patches);
    }

    if (mustAnonymizeBluetoothAddress(attributionSource, String16(__func__))) {
        for (size_t i = 0; i < numPatchesReq; ++i) {