Loading services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +50 −164 Original line number Diff line number Diff line Loading @@ -23,8 +23,6 @@ #include <android/content/AttributionSourceState.h> #include <android_media_audiopolicy.h> #include <com_android_media_audio.h> #include <error/expected_utils.h> #include <media/AidlConversion.h> #include <media/AudioPolicy.h> #include <media/AudioValidator.h> Loading @@ -46,30 +44,13 @@ if (!_tmp.isOk()) return _tmp; \ } #define CHECK_PERM(expr1, expr2) \ VALUE_OR_RETURN_STATUS(getPermissionProvider().checkPermission((expr1), (expr2))) #define MAX_ITEMS_PER_LIST 1024 namespace android { namespace audiopolicy_flags = android::media::audiopolicy; using binder::Status; using aidl_utils::binderStatusFromStatusT; using com::android::media::audio::audioserver_permissions; using com::android::media::permission::NativePermissionController; using com::android::media::permission::PermissionEnum::ACCESS_ULTRASOUND; using com::android::media::permission::PermissionEnum::CALL_AUDIO_INTERCEPTION; using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_HOTWORD; using com::android::media::permission::PermissionEnum::CAPTURE_VOICE_COMMUNICATION_OUTPUT; using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_OUTPUT; using com::android::media::permission::PermissionEnum::CAPTURE_MEDIA_OUTPUT; using com::android::media::permission::PermissionEnum::CAPTURE_TUNER_AUDIO_INPUT; using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_ROUTING; using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_SETTINGS; using com::android::media::permission::PermissionEnum::MODIFY_DEFAULT_AUDIO_EFFECTS; using com::android::media::permission::PermissionEnum::MODIFY_PHONE_STATE; using com::android::media::permission::PermissionEnum::RECORD_AUDIO; using com::android::media::permission::PermissionEnum::WRITE_SECURE_SETTINGS; using content::AttributionSourceState; using media::audio::common::AudioConfig; using media::audio::common::AudioConfigBase; Loading Loading @@ -105,37 +86,31 @@ bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) { != std::end(mSupportedSystemUsages); } Status AudioPolicyService::validateUsage(const audio_attributes_t& attr) { status_t AudioPolicyService::validateUsage(const audio_attributes_t& attr) { return validateUsage(attr, getCallingAttributionSource()); } Status AudioPolicyService::validateUsage(const audio_attributes_t& attr, status_t AudioPolicyService::validateUsage(const audio_attributes_t& attr, const AttributionSourceState& attributionSource) { if (isSystemUsage(attr.usage)) { if (isSupportedSystemUsage(attr.usage)) { if (attr.usage == AUDIO_USAGE_CALL_ASSISTANT && ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)) { if (!(audioserver_permissions() ? CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid) : callAudioInterceptionAllowed(attributionSource))) { if (!callAudioInterceptionAllowed(attributionSource)) { ALOGE("%s: call audio interception not allowed for attribution source: %s", __func__, attributionSource.toString().c_str()); return Status::fromExceptionCode(Status::EX_SECURITY, "Call audio interception not allowed"); return PERMISSION_DENIED; } } else if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) : modifyAudioRoutingAllowed(attributionSource))) { } else if (!modifyAudioRoutingAllowed(attributionSource)) { ALOGE("%s: modify audio routing not allowed for attribution source: %s", __func__, attributionSource.toString().c_str()); return Status::fromExceptionCode(Status::EX_SECURITY, "Modify audio routing not allowed"); return PERMISSION_DENIED; } } else { return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT); return BAD_VALUE; } } return Status::ok(); return NO_ERROR; } Loading @@ -162,9 +137,7 @@ Status AudioPolicyService::setDeviceConnectionState( if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE && Loading Loading @@ -218,9 +191,7 @@ Status AudioPolicyService::handleDeviceConfigChange( if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading @@ -244,9 +215,7 @@ Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl) if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (uint32_t(state) >= AUDIO_MODE_CNT) { Loading Loading @@ -296,9 +265,7 @@ Status AudioPolicyService::setForceUse(media::AudioPolicyForceUse usageAidl, return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if (!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading Loading @@ -388,7 +355,7 @@ Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAtt RETURN_IF_BINDER_ERROR( binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950"))); RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource)); RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr, attributionSource))); ALOGV("%s()", __func__); audio_utils::lock_guard _l(mMutex); Loading @@ -397,22 +364,14 @@ Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAtt aidl2legacy_int32_t_uid_t(attributionSource.uid)))) { attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION); } const bool bypassInterruptionAllowed = audioserver_permissions() ? ( CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) || CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) || CHECK_PERM(WRITE_SECURE_SETTINGS, attributionSource.uid)) : bypassInterruptionPolicyAllowed(attributionSource); if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0) && !bypassInterruptionAllowed) { && !bypassInterruptionPolicyAllowed(attributionSource)) { attr.flags = static_cast<audio_flags_mask_t>( attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)); } if (attr.content_type == AUDIO_CONTENT_TYPE_ULTRASOUND) { if (!(audioserver_permissions() ? CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid) : accessUltrasoundAllowed(attributionSource))) { if (!accessUltrasoundAllowed(attributionSource)) { ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d", __func__, attributionSource.uid, attributionSource.pid); return binderStatusFromStatusT(PERMISSION_DENIED); Loading Loading @@ -441,24 +400,18 @@ Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAtt break; case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX: if (((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0) && !(audioserver_permissions() ? CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid) : callAudioInterceptionAllowed(attributionSource))) { && !callAudioInterceptionAllowed(attributionSource)) { ALOGE("%s() permission denied: call redirection not allowed for uid %d", __func__, attributionSource.uid); result = PERMISSION_DENIED; } else if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) : modifyPhoneStateAllowed(attributionSource))) { } else if (!modifyPhoneStateAllowed(attributionSource)) { ALOGE("%s() permission denied: modify phone state not allowed for uid %d", __func__, attributionSource.uid); result = PERMISSION_DENIED; } break; case AudioPolicyInterface::API_OUT_MIX_PLAYBACK: if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) : modifyAudioRoutingAllowed(attributionSource))) { if (!modifyAudioRoutingAllowed(attributionSource)) { ALOGE("%s() permission denied: modify audio routing not allowed for uid %d", __func__, attributionSource.uid); result = PERMISSION_DENIED; Loading Loading @@ -677,7 +630,8 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr return binderStatusFromStatusT(BAD_VALUE); } RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource)); RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr, attributionSource))); uint32_t virtualDeviceId = kDefaultVirtualDeviceId; Loading @@ -690,10 +644,7 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr // type is API_INPUT_MIX_EXT_POLICY_REROUTE and by AudioService if a media projection // is used and input type is API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK // - ECHO_REFERENCE source is controlled by captureAudioOutputAllowed() const auto isRecordingAllowed = audioserver_permissions() ? CHECK_PERM(RECORD_AUDIO, attributionSource.uid) : recordingAllowed(attributionSource, inputSource); if (!(isRecordingAllowed if (!(recordingAllowed(attributionSource, inputSource) || inputSource == AUDIO_SOURCE_FM_TUNER || inputSource == AUDIO_SOURCE_REMOTE_SUBMIX || inputSource == AUDIO_SOURCE_ECHO_REFERENCE)) { Loading @@ -702,12 +653,8 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr return binderStatusFromStatusT(PERMISSION_DENIED); } bool canCaptureOutput = audioserver_permissions() ? CHECK_PERM(CAPTURE_AUDIO_OUTPUT, attributionSource.uid) : captureAudioOutputAllowed(attributionSource); bool canInterceptCallAudio = audioserver_permissions() ? CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid) : callAudioInterceptionAllowed(attributionSource); bool canCaptureOutput = captureAudioOutputAllowed(attributionSource); bool canInterceptCallAudio = callAudioInterceptionAllowed(attributionSource); bool isCallAudioSource = inputSource == AUDIO_SOURCE_VOICE_UPLINK || inputSource == AUDIO_SOURCE_VOICE_DOWNLINK || inputSource == AUDIO_SOURCE_VOICE_CALL; Loading @@ -721,15 +668,11 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr } if (inputSource == AUDIO_SOURCE_FM_TUNER && !canCaptureOutput && !(audioserver_permissions() ? CHECK_PERM(CAPTURE_TUNER_AUDIO_INPUT, attributionSource.uid) : captureTunerAudioInputAllowed(attributionSource))) { && !captureTunerAudioInputAllowed(attributionSource)) { return binderStatusFromStatusT(PERMISSION_DENIED); } bool canCaptureHotword = audioserver_permissions() ? CHECK_PERM(CAPTURE_AUDIO_HOTWORD, attributionSource.uid) : captureHotwordAllowed(attributionSource); bool canCaptureHotword = captureHotwordAllowed(attributionSource); if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading @@ -744,9 +687,7 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr } if (attr.source == AUDIO_SOURCE_ULTRASOUND) { if (!(audioserver_permissions() ? CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid) : accessUltrasoundAllowed(attributionSource))) { if (!accessUltrasoundAllowed(attributionSource)) { ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d", __func__, attributionSource.uid, attributionSource.pid); return binderStatusFromStatusT(PERMISSION_DENIED); Loading Loading @@ -792,29 +733,14 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr status = PERMISSION_DENIED; } break; case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: { bool modAudioRoutingAllowed; if (audioserver_permissions()) { auto result = getPermissionProvider().checkPermission( MODIFY_AUDIO_ROUTING, attributionSource.uid); if (!result.ok()) { ALOGE("%s permission provider error: %s", __func__, result.error().toString8().c_str()); status = aidl_utils::statusTFromBinderStatus(result.error()); break; } modAudioRoutingAllowed = result.value(); } else { modAudioRoutingAllowed = modifyAudioRoutingAllowed(attributionSource); } if (!(modAudioRoutingAllowed case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: if (!(modifyAudioRoutingAllowed(attributionSource) || ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0 && canInterceptCallAudio))) { ALOGE("%s permission denied for remote submix capture", __func__); status = PERMISSION_DENIED; } break; } case AudioPolicyInterface::API_INPUT_INVALID: default: LOG_ALWAYS_FATAL("%s encountered an invalid input type %d", Loading Loading @@ -1109,9 +1035,7 @@ Status AudioPolicyService::setDeviceAbsoluteVolumeEnabled(const AudioDevice& dev if (mAudioPolicyManager == nullptr) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (uint32_t(streamToDriveAbs) >= AUDIO_STREAM_PUBLIC_CNT) { Loading @@ -1135,9 +1059,7 @@ Status AudioPolicyService::initStreamVolume(AudioStreamType streamAidl, if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { Loading @@ -1161,9 +1083,7 @@ Status AudioPolicyService::setStreamVolumeIndex(AudioStreamType streamAidl, if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { Loading Loading @@ -1213,9 +1133,7 @@ Status AudioPolicyService::setVolumeIndexForAttributes( if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } audio_utils::lock_guard _l(mMutex); Loading Loading @@ -1521,9 +1439,7 @@ Status AudioPolicyService::addSourceDefaultEffect(const AudioUuid& typeAidl, sp<AudioPolicyEffects>audioPolicyEffects; RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects))); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid()) : modifyDefaultAudioEffectsAllowed())) { if (!modifyDefaultAudioEffectsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect( Loading @@ -1549,9 +1465,7 @@ Status AudioPolicyService::addStreamDefaultEffect(const AudioUuid& typeAidl, sp<AudioPolicyEffects> audioPolicyEffects; RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects))); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid()) : modifyDefaultAudioEffectsAllowed())) { if (!modifyDefaultAudioEffectsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect( Loading @@ -1566,9 +1480,7 @@ Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl) aidl2legacy_int32_t_audio_unique_id_t(idAidl)); sp<AudioPolicyEffects>audioPolicyEffects; RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects))); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid()) : modifyDefaultAudioEffectsAllowed())) { if (!modifyDefaultAudioEffectsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id)); Loading @@ -1580,9 +1492,7 @@ Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl) aidl2legacy_int32_t_audio_unique_id_t(idAidl)); sp<AudioPolicyEffects>audioPolicyEffects; RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects))); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid()) : modifyDefaultAudioEffectsAllowed())) { if (!modifyDefaultAudioEffectsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id)); Loading @@ -1600,9 +1510,7 @@ Status AudioPolicyService::setSupportedSystemUsages( std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t))); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading Loading @@ -1661,7 +1569,7 @@ Status AudioPolicyService::isDirectOutputSupported( return binderStatusFromStatusT(NO_INIT); } RETURN_IF_BINDER_ERROR(validateUsage(attributes)); RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes))); audio_utils::lock_guard _l(mMutex); *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes); Loading Loading @@ -1736,9 +1644,7 @@ Status AudioPolicyService::createAudioPatch(const media::AudioPatchFw& patchAidl RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch))); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading @@ -1757,9 +1663,7 @@ Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl) audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS( aidl2legacy_int32_t_audio_patch_handle_t(handleAidl)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading Loading @@ -1807,9 +1711,7 @@ Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfigFw& co binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config))); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading Loading @@ -1872,9 +1774,7 @@ Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix // loopback|render only need a MediaProjection (checked in caller AudioService.java) bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) { return !is_mix_loopback_render(mix.mRouteFlags); }); if (needModifyAudioRouting && !(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading @@ -1890,16 +1790,12 @@ Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix const AttributionSourceState attributionSource = getCallingAttributionSource(); if (needCaptureMediaOutput && !(audioserver_permissions() ? CHECK_PERM(CAPTURE_MEDIA_OUTPUT, attributionSource.uid) : modifyAudioRoutingAllowed())) { if (needCaptureMediaOutput && !captureMediaOutputAllowed(attributionSource)) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (needCaptureVoiceCommunicationOutput && !(audioserver_permissions() ? CHECK_PERM(CAPTURE_VOICE_COMMUNICATION_OUTPUT, attributionSource.uid) : captureVoiceCommunicationOutputAllowed(attributionSource))) { !captureVoiceCommunicationOutputAllowed(attributionSource)) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading Loading @@ -1956,9 +1852,7 @@ Status AudioPolicyService::setUidDeviceAffinities( aidl2legacy_AudioDeviceTypeAddress)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading @@ -1972,9 +1866,7 @@ Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) { uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading @@ -1993,9 +1885,7 @@ Status AudioPolicyService::setUserIdDeviceAffinities( aidl2legacy_AudioDeviceTypeAddress)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading @@ -2009,9 +1899,7 @@ Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) { int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading Loading @@ -2039,7 +1927,7 @@ Status AudioPolicyService::startAudioSource(const media::AudioPortConfigFw& sour return binderStatusFromStatusT(NO_INIT); } RETURN_IF_BINDER_ERROR(validateUsage(attributes)); RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes))); // startAudioSource should be created as the calling uid const uid_t callingUid = IPCThreadState::self()->getCallingUid(); Loading Loading @@ -2068,9 +1956,7 @@ Status AudioPolicyService::setMasterMono(bool mono) if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } audio_utils::lock_guard _l(mMutex); Loading services/audiopolicy/service/AudioPolicyService.h +2 −2 Original line number Diff line number Diff line Loading @@ -452,8 +452,8 @@ private: app_state_t apmStatFromAmState(int amState); bool isSupportedSystemUsage(audio_usage_t usage); binder::Status validateUsage(const audio_attributes_t& attr); binder::Status validateUsage(const audio_attributes_t& attr, status_t validateUsage(const audio_attributes_t& attr); status_t validateUsage(const audio_attributes_t& attr, const AttributionSourceState& attributionSource); void updateUidStates(); Loading Loading
services/audiopolicy/service/AudioPolicyInterfaceImpl.cpp +50 −164 Original line number Diff line number Diff line Loading @@ -23,8 +23,6 @@ #include <android/content/AttributionSourceState.h> #include <android_media_audiopolicy.h> #include <com_android_media_audio.h> #include <error/expected_utils.h> #include <media/AidlConversion.h> #include <media/AudioPolicy.h> #include <media/AudioValidator.h> Loading @@ -46,30 +44,13 @@ if (!_tmp.isOk()) return _tmp; \ } #define CHECK_PERM(expr1, expr2) \ VALUE_OR_RETURN_STATUS(getPermissionProvider().checkPermission((expr1), (expr2))) #define MAX_ITEMS_PER_LIST 1024 namespace android { namespace audiopolicy_flags = android::media::audiopolicy; using binder::Status; using aidl_utils::binderStatusFromStatusT; using com::android::media::audio::audioserver_permissions; using com::android::media::permission::NativePermissionController; using com::android::media::permission::PermissionEnum::ACCESS_ULTRASOUND; using com::android::media::permission::PermissionEnum::CALL_AUDIO_INTERCEPTION; using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_HOTWORD; using com::android::media::permission::PermissionEnum::CAPTURE_VOICE_COMMUNICATION_OUTPUT; using com::android::media::permission::PermissionEnum::CAPTURE_AUDIO_OUTPUT; using com::android::media::permission::PermissionEnum::CAPTURE_MEDIA_OUTPUT; using com::android::media::permission::PermissionEnum::CAPTURE_TUNER_AUDIO_INPUT; using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_ROUTING; using com::android::media::permission::PermissionEnum::MODIFY_AUDIO_SETTINGS; using com::android::media::permission::PermissionEnum::MODIFY_DEFAULT_AUDIO_EFFECTS; using com::android::media::permission::PermissionEnum::MODIFY_PHONE_STATE; using com::android::media::permission::PermissionEnum::RECORD_AUDIO; using com::android::media::permission::PermissionEnum::WRITE_SECURE_SETTINGS; using content::AttributionSourceState; using media::audio::common::AudioConfig; using media::audio::common::AudioConfigBase; Loading Loading @@ -105,37 +86,31 @@ bool AudioPolicyService::isSupportedSystemUsage(audio_usage_t usage) { != std::end(mSupportedSystemUsages); } Status AudioPolicyService::validateUsage(const audio_attributes_t& attr) { status_t AudioPolicyService::validateUsage(const audio_attributes_t& attr) { return validateUsage(attr, getCallingAttributionSource()); } Status AudioPolicyService::validateUsage(const audio_attributes_t& attr, status_t AudioPolicyService::validateUsage(const audio_attributes_t& attr, const AttributionSourceState& attributionSource) { if (isSystemUsage(attr.usage)) { if (isSupportedSystemUsage(attr.usage)) { if (attr.usage == AUDIO_USAGE_CALL_ASSISTANT && ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0)) { if (!(audioserver_permissions() ? CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid) : callAudioInterceptionAllowed(attributionSource))) { if (!callAudioInterceptionAllowed(attributionSource)) { ALOGE("%s: call audio interception not allowed for attribution source: %s", __func__, attributionSource.toString().c_str()); return Status::fromExceptionCode(Status::EX_SECURITY, "Call audio interception not allowed"); return PERMISSION_DENIED; } } else if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) : modifyAudioRoutingAllowed(attributionSource))) { } else if (!modifyAudioRoutingAllowed(attributionSource)) { ALOGE("%s: modify audio routing not allowed for attribution source: %s", __func__, attributionSource.toString().c_str()); return Status::fromExceptionCode(Status::EX_SECURITY, "Modify audio routing not allowed"); return PERMISSION_DENIED; } } else { return Status::fromExceptionCode(Status::EX_ILLEGAL_ARGUMENT); return BAD_VALUE; } } return Status::ok(); return NO_ERROR; } Loading @@ -162,9 +137,7 @@ Status AudioPolicyService::setDeviceConnectionState( if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (state != AUDIO_POLICY_DEVICE_STATE_AVAILABLE && Loading Loading @@ -218,9 +191,7 @@ Status AudioPolicyService::handleDeviceConfigChange( if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading @@ -244,9 +215,7 @@ Status AudioPolicyService::setPhoneState(AudioMode stateAidl, int32_t uidAidl) if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (uint32_t(state) >= AUDIO_MODE_CNT) { Loading Loading @@ -296,9 +265,7 @@ Status AudioPolicyService::setForceUse(media::AudioPolicyForceUse usageAidl, return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if (!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading Loading @@ -388,7 +355,7 @@ Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAtt RETURN_IF_BINDER_ERROR( binderStatusFromStatusT(AudioValidator::validateAudioAttributes(attr, "68953950"))); RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource)); RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr, attributionSource))); ALOGV("%s()", __func__); audio_utils::lock_guard _l(mMutex); Loading @@ -397,22 +364,14 @@ Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAtt aidl2legacy_int32_t_uid_t(attributionSource.uid)))) { attr.flags = static_cast<audio_flags_mask_t>(attr.flags | AUDIO_FLAG_NO_MEDIA_PROJECTION); } const bool bypassInterruptionAllowed = audioserver_permissions() ? ( CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) || CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) || CHECK_PERM(WRITE_SECURE_SETTINGS, attributionSource.uid)) : bypassInterruptionPolicyAllowed(attributionSource); if (((attr.flags & (AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)) != 0) && !bypassInterruptionAllowed) { && !bypassInterruptionPolicyAllowed(attributionSource)) { attr.flags = static_cast<audio_flags_mask_t>( attr.flags & ~(AUDIO_FLAG_BYPASS_INTERRUPTION_POLICY|AUDIO_FLAG_BYPASS_MUTE)); } if (attr.content_type == AUDIO_CONTENT_TYPE_ULTRASOUND) { if (!(audioserver_permissions() ? CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid) : accessUltrasoundAllowed(attributionSource))) { if (!accessUltrasoundAllowed(attributionSource)) { ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d", __func__, attributionSource.uid, attributionSource.pid); return binderStatusFromStatusT(PERMISSION_DENIED); Loading Loading @@ -441,24 +400,18 @@ Status AudioPolicyService::getOutputForAttr(const media::audio::common::AudioAtt break; case AudioPolicyInterface::API_OUTPUT_TELEPHONY_TX: if (((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0) && !(audioserver_permissions() ? CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid) : callAudioInterceptionAllowed(attributionSource))) { && !callAudioInterceptionAllowed(attributionSource)) { ALOGE("%s() permission denied: call redirection not allowed for uid %d", __func__, attributionSource.uid); result = PERMISSION_DENIED; } else if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_PHONE_STATE, attributionSource.uid) : modifyPhoneStateAllowed(attributionSource))) { } else if (!modifyPhoneStateAllowed(attributionSource)) { ALOGE("%s() permission denied: modify phone state not allowed for uid %d", __func__, attributionSource.uid); result = PERMISSION_DENIED; } break; case AudioPolicyInterface::API_OUT_MIX_PLAYBACK: if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, attributionSource.uid) : modifyAudioRoutingAllowed(attributionSource))) { if (!modifyAudioRoutingAllowed(attributionSource)) { ALOGE("%s() permission denied: modify audio routing not allowed for uid %d", __func__, attributionSource.uid); result = PERMISSION_DENIED; Loading Loading @@ -677,7 +630,8 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr return binderStatusFromStatusT(BAD_VALUE); } RETURN_IF_BINDER_ERROR(validateUsage(attr, attributionSource)); RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attr, attributionSource))); uint32_t virtualDeviceId = kDefaultVirtualDeviceId; Loading @@ -690,10 +644,7 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr // type is API_INPUT_MIX_EXT_POLICY_REROUTE and by AudioService if a media projection // is used and input type is API_INPUT_MIX_PUBLIC_CAPTURE_PLAYBACK // - ECHO_REFERENCE source is controlled by captureAudioOutputAllowed() const auto isRecordingAllowed = audioserver_permissions() ? CHECK_PERM(RECORD_AUDIO, attributionSource.uid) : recordingAllowed(attributionSource, inputSource); if (!(isRecordingAllowed if (!(recordingAllowed(attributionSource, inputSource) || inputSource == AUDIO_SOURCE_FM_TUNER || inputSource == AUDIO_SOURCE_REMOTE_SUBMIX || inputSource == AUDIO_SOURCE_ECHO_REFERENCE)) { Loading @@ -702,12 +653,8 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr return binderStatusFromStatusT(PERMISSION_DENIED); } bool canCaptureOutput = audioserver_permissions() ? CHECK_PERM(CAPTURE_AUDIO_OUTPUT, attributionSource.uid) : captureAudioOutputAllowed(attributionSource); bool canInterceptCallAudio = audioserver_permissions() ? CHECK_PERM(CALL_AUDIO_INTERCEPTION, attributionSource.uid) : callAudioInterceptionAllowed(attributionSource); bool canCaptureOutput = captureAudioOutputAllowed(attributionSource); bool canInterceptCallAudio = callAudioInterceptionAllowed(attributionSource); bool isCallAudioSource = inputSource == AUDIO_SOURCE_VOICE_UPLINK || inputSource == AUDIO_SOURCE_VOICE_DOWNLINK || inputSource == AUDIO_SOURCE_VOICE_CALL; Loading @@ -721,15 +668,11 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr } if (inputSource == AUDIO_SOURCE_FM_TUNER && !canCaptureOutput && !(audioserver_permissions() ? CHECK_PERM(CAPTURE_TUNER_AUDIO_INPUT, attributionSource.uid) : captureTunerAudioInputAllowed(attributionSource))) { && !captureTunerAudioInputAllowed(attributionSource)) { return binderStatusFromStatusT(PERMISSION_DENIED); } bool canCaptureHotword = audioserver_permissions() ? CHECK_PERM(CAPTURE_AUDIO_HOTWORD, attributionSource.uid) : captureHotwordAllowed(attributionSource); bool canCaptureHotword = captureHotwordAllowed(attributionSource); if ((inputSource == AUDIO_SOURCE_HOTWORD) && !canCaptureHotword) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading @@ -744,9 +687,7 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr } if (attr.source == AUDIO_SOURCE_ULTRASOUND) { if (!(audioserver_permissions() ? CHECK_PERM(ACCESS_ULTRASOUND, attributionSource.uid) : accessUltrasoundAllowed(attributionSource))) { if (!accessUltrasoundAllowed(attributionSource)) { ALOGE("%s: permission denied: ultrasound not allowed for uid %d pid %d", __func__, attributionSource.uid, attributionSource.pid); return binderStatusFromStatusT(PERMISSION_DENIED); Loading Loading @@ -792,29 +733,14 @@ Status AudioPolicyService::getInputForAttr(const media::audio::common::AudioAttr status = PERMISSION_DENIED; } break; case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: { bool modAudioRoutingAllowed; if (audioserver_permissions()) { auto result = getPermissionProvider().checkPermission( MODIFY_AUDIO_ROUTING, attributionSource.uid); if (!result.ok()) { ALOGE("%s permission provider error: %s", __func__, result.error().toString8().c_str()); status = aidl_utils::statusTFromBinderStatus(result.error()); break; } modAudioRoutingAllowed = result.value(); } else { modAudioRoutingAllowed = modifyAudioRoutingAllowed(attributionSource); } if (!(modAudioRoutingAllowed case AudioPolicyInterface::API_INPUT_MIX_EXT_POLICY_REROUTE: if (!(modifyAudioRoutingAllowed(attributionSource) || ((attr.flags & AUDIO_FLAG_CALL_REDIRECTION) != 0 && canInterceptCallAudio))) { ALOGE("%s permission denied for remote submix capture", __func__); status = PERMISSION_DENIED; } break; } case AudioPolicyInterface::API_INPUT_INVALID: default: LOG_ALWAYS_FATAL("%s encountered an invalid input type %d", Loading Loading @@ -1109,9 +1035,7 @@ Status AudioPolicyService::setDeviceAbsoluteVolumeEnabled(const AudioDevice& dev if (mAudioPolicyManager == nullptr) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (uint32_t(streamToDriveAbs) >= AUDIO_STREAM_PUBLIC_CNT) { Loading @@ -1135,9 +1059,7 @@ Status AudioPolicyService::initStreamVolume(AudioStreamType streamAidl, if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { Loading @@ -1161,9 +1083,7 @@ Status AudioPolicyService::setStreamVolumeIndex(AudioStreamType streamAidl, if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (uint32_t(stream) >= AUDIO_STREAM_PUBLIC_CNT) { Loading Loading @@ -1213,9 +1133,7 @@ Status AudioPolicyService::setVolumeIndexForAttributes( if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } audio_utils::lock_guard _l(mMutex); Loading Loading @@ -1521,9 +1439,7 @@ Status AudioPolicyService::addSourceDefaultEffect(const AudioUuid& typeAidl, sp<AudioPolicyEffects>audioPolicyEffects; RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects))); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid()) : modifyDefaultAudioEffectsAllowed())) { if (!modifyDefaultAudioEffectsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addSourceDefaultEffect( Loading @@ -1549,9 +1465,7 @@ Status AudioPolicyService::addStreamDefaultEffect(const AudioUuid& typeAidl, sp<AudioPolicyEffects> audioPolicyEffects; RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects))); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid()) : modifyDefaultAudioEffectsAllowed())) { if (!modifyDefaultAudioEffectsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(audioPolicyEffects->addStreamDefaultEffect( Loading @@ -1566,9 +1480,7 @@ Status AudioPolicyService::removeSourceDefaultEffect(int32_t idAidl) aidl2legacy_int32_t_audio_unique_id_t(idAidl)); sp<AudioPolicyEffects>audioPolicyEffects; RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects))); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid()) : modifyDefaultAudioEffectsAllowed())) { if (!modifyDefaultAudioEffectsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } return binderStatusFromStatusT(audioPolicyEffects->removeSourceDefaultEffect(id)); Loading @@ -1580,9 +1492,7 @@ Status AudioPolicyService::removeStreamDefaultEffect(int32_t idAidl) aidl2legacy_int32_t_audio_unique_id_t(idAidl)); sp<AudioPolicyEffects>audioPolicyEffects; RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(getAudioPolicyEffects(audioPolicyEffects))); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_DEFAULT_AUDIO_EFFECTS, IPCThreadState::self()->getCallingUid()) : modifyDefaultAudioEffectsAllowed())) { if (!modifyDefaultAudioEffectsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } return binderStatusFromStatusT(audioPolicyEffects->removeStreamDefaultEffect(id)); Loading @@ -1600,9 +1510,7 @@ Status AudioPolicyService::setSupportedSystemUsages( std::back_inserter(systemUsages), aidl2legacy_AudioUsage_audio_usage_t))); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading Loading @@ -1661,7 +1569,7 @@ Status AudioPolicyService::isDirectOutputSupported( return binderStatusFromStatusT(NO_INIT); } RETURN_IF_BINDER_ERROR(validateUsage(attributes)); RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes))); audio_utils::lock_guard _l(mMutex); *_aidl_return = mAudioPolicyManager->isDirectOutputSupported(config, attributes); Loading Loading @@ -1736,9 +1644,7 @@ Status AudioPolicyService::createAudioPatch(const media::AudioPatchFw& patchAidl RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(AudioValidator::validateAudioPatch(patch))); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading @@ -1757,9 +1663,7 @@ Status AudioPolicyService::releaseAudioPatch(int32_t handleAidl) audio_patch_handle_t handle = VALUE_OR_RETURN_BINDER_STATUS( aidl2legacy_int32_t_audio_patch_handle_t(handleAidl)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading Loading @@ -1807,9 +1711,7 @@ Status AudioPolicyService::setAudioPortConfig(const media::AudioPortConfigFw& co binderStatusFromStatusT(AudioValidator::validateAudioPortConfig(config))); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading Loading @@ -1872,9 +1774,7 @@ Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix // loopback|render only need a MediaProjection (checked in caller AudioService.java) bool needModifyAudioRouting = std::any_of(mixes.begin(), mixes.end(), [](auto& mix) { return !is_mix_loopback_render(mix.mRouteFlags); }); if (needModifyAudioRouting && !(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if (needModifyAudioRouting && !modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading @@ -1890,16 +1790,12 @@ Status AudioPolicyService::registerPolicyMixes(const std::vector<media::AudioMix const AttributionSourceState attributionSource = getCallingAttributionSource(); if (needCaptureMediaOutput && !(audioserver_permissions() ? CHECK_PERM(CAPTURE_MEDIA_OUTPUT, attributionSource.uid) : modifyAudioRoutingAllowed())) { if (needCaptureMediaOutput && !captureMediaOutputAllowed(attributionSource)) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (needCaptureVoiceCommunicationOutput && !(audioserver_permissions() ? CHECK_PERM(CAPTURE_VOICE_COMMUNICATION_OUTPUT, attributionSource.uid) : captureVoiceCommunicationOutputAllowed(attributionSource))) { !captureVoiceCommunicationOutputAllowed(attributionSource)) { return binderStatusFromStatusT(PERMISSION_DENIED); } Loading Loading @@ -1956,9 +1852,7 @@ Status AudioPolicyService::setUidDeviceAffinities( aidl2legacy_AudioDeviceTypeAddress)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading @@ -1972,9 +1866,7 @@ Status AudioPolicyService::removeUidDeviceAffinities(int32_t uidAidl) { uid_t uid = VALUE_OR_RETURN_BINDER_STATUS(aidl2legacy_int32_t_uid_t(uidAidl)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading @@ -1993,9 +1885,7 @@ Status AudioPolicyService::setUserIdDeviceAffinities( aidl2legacy_AudioDeviceTypeAddress)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading @@ -2009,9 +1899,7 @@ Status AudioPolicyService::removeUserIdDeviceAffinities(int32_t userIdAidl) { int userId = VALUE_OR_RETURN_BINDER_STATUS(convertReinterpret<int>(userIdAidl)); audio_utils::lock_guard _l(mMutex); if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_ROUTING, IPCThreadState::self()->getCallingUid()) : modifyAudioRoutingAllowed())) { if(!modifyAudioRoutingAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } if (mAudioPolicyManager == NULL) { Loading Loading @@ -2039,7 +1927,7 @@ Status AudioPolicyService::startAudioSource(const media::AudioPortConfigFw& sour return binderStatusFromStatusT(NO_INIT); } RETURN_IF_BINDER_ERROR(validateUsage(attributes)); RETURN_IF_BINDER_ERROR(binderStatusFromStatusT(validateUsage(attributes))); // startAudioSource should be created as the calling uid const uid_t callingUid = IPCThreadState::self()->getCallingUid(); Loading Loading @@ -2068,9 +1956,7 @@ Status AudioPolicyService::setMasterMono(bool mono) if (mAudioPolicyManager == NULL) { return binderStatusFromStatusT(NO_INIT); } if (!(audioserver_permissions() ? CHECK_PERM(MODIFY_AUDIO_SETTINGS, IPCThreadState::self()->getCallingUid()) : settingsAllowed())) { if (!settingsAllowed()) { return binderStatusFromStatusT(PERMISSION_DENIED); } audio_utils::lock_guard _l(mMutex); Loading
services/audiopolicy/service/AudioPolicyService.h +2 −2 Original line number Diff line number Diff line Loading @@ -452,8 +452,8 @@ private: app_state_t apmStatFromAmState(int amState); bool isSupportedSystemUsage(audio_usage_t usage); binder::Status validateUsage(const audio_attributes_t& attr); binder::Status validateUsage(const audio_attributes_t& attr, status_t validateUsage(const audio_attributes_t& attr); status_t validateUsage(const audio_attributes_t& attr, const AttributionSourceState& attributionSource); void updateUidStates(); Loading