Loading services/audioflinger/AudioFlinger.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -1723,7 +1723,8 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu &output.notificationFrameCount, clientUid, &output.flags, input.clientInfo.clientTid, &lStatus, portId); &lStatus, portId, input.opPackageName); LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0)); // lStatus == BAD_TYPE means FAST flag was rejected: request a new input from Loading services/audioflinger/AudioFlinger.h +2 −0 Original line number Diff line number Diff line Loading @@ -48,7 +48,9 @@ #include <utils/TypeHelpers.h> #include <utils/Vector.h> #include <binder/AppOpsManager.h> #include <binder/BinderService.h> #include <binder/IAppOpsCallback.h> #include <binder/MemoryDealer.h> #include <system/audio.h> Loading services/audioflinger/RecordTracks.h +40 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,39 @@ #error This header file should only be included from AudioFlinger.h #endif // Checks and monitors OP_RECORD_AUDIO class OpRecordAudioMonitor : public RefBase { public: ~OpRecordAudioMonitor() override; bool hasOpRecordAudio() const; static sp<OpRecordAudioMonitor> createIfNeeded(uid_t uid, const String16& opPackageName); private: OpRecordAudioMonitor(uid_t uid, const String16& opPackageName); void onFirstRef() override; AppOpsManager mAppOpsManager; class RecordAudioOpCallback : public BnAppOpsCallback { public: explicit RecordAudioOpCallback(const wp<OpRecordAudioMonitor>& monitor); void opChanged(int32_t op, const String16& packageName) override; private: const wp<OpRecordAudioMonitor> mMonitor; }; sp<RecordAudioOpCallback> mOpCallback; // called by RecordAudioOpCallback when OP_RECORD_AUDIO is updated in AppOp callback // and in onFirstRef() void checkRecordAudio(); std::atomic_bool mHasOpRecordAudio; const uid_t mUid; const String16 mPackage; }; // record track class RecordTrack : public TrackBase { public: Loading @@ -35,6 +68,7 @@ public: uid_t uid, audio_input_flags_t flags, track_type type, const String16& opPackageName, audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE); virtual ~RecordTrack(); virtual status_t initCheck() const; Loading Loading @@ -65,7 +99,7 @@ public: virtual bool isFastTrack() const { return (mFlags & AUDIO_INPUT_FLAG_FAST) != 0; } void setSilenced(bool silenced) { if (!isPatchTrack()) mSilenced = silenced; } bool isSilenced() const { return mSilenced; } bool isSilenced() const; status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones); Loading Loading @@ -99,6 +133,11 @@ private: audio_input_flags_t mFlags; bool mSilenced; // used to enforce OP_RECORD_AUDIO uid_t mUid; String16 mOpPackageName; sp<OpRecordAudioMonitor> mOpRecordAudioMonitor; }; // playback track, used by PatchPanel Loading services/audioflinger/ServiceUtilities.h +9 −0 Original line number Diff line number Diff line Loading @@ -14,12 +14,21 @@ * limitations under the License. */ #include <cutils/multiuser.h> #include <private/android_filesystem_config.h> #include <unistd.h> #include <binder/PermissionController.h> namespace android { // Used for calls that should originate from system services. // We allow that some services might have separate processes to // handle multiple users, e.g. u10_system, u10_bluetooth, u10_radio. static inline bool isServiceUid(uid_t uid) { return multiuser_get_app_id(uid) < AID_APP_START; } extern pid_t getpid_cached; bool isTrustedCallingUid(uid_t uid); bool recordingAllowed(const String16& opPackageName, pid_t pid, uid_t uid); Loading services/audioflinger/Threads.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -6778,7 +6778,7 @@ reacquire_wakelock: // Sanitize before releasing if the track has no access to the source data // An idle UID receives silence from non virtual devices until active if (activeTrack->isSilenced()) { memset(activeTrack->mSink.raw, 0, framesOut * mFrameSize); memset(activeTrack->mSink.raw, 0, framesOut * activeTrack->frameSize()); } activeTrack->releaseBuffer(&activeTrack->mSink); } Loading Loading @@ -6921,7 +6921,8 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe audio_input_flags_t *flags, pid_t tid, status_t *status, audio_port_handle_t portId) audio_port_handle_t portId, const String16& opPackageName) { size_t frameCount = *pFrameCount; size_t notificationFrameCount = *pNotificationFrameCount; Loading Loading @@ -7047,7 +7048,7 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe track = new RecordTrack(this, client, attr, sampleRate, format, channelMask, frameCount, nullptr /* buffer */, (size_t)0 /* bufferSize */, sessionId, uid, *flags, TrackBase::TYPE_DEFAULT, portId); *flags, TrackBase::TYPE_DEFAULT, opPackageName, portId); lStatus = track->initCheck(); if (lStatus != NO_ERROR) { Loading Loading
services/audioflinger/AudioFlinger.cpp +2 −1 Original line number Diff line number Diff line Loading @@ -1723,7 +1723,8 @@ sp<media::IAudioRecord> AudioFlinger::createRecord(const CreateRecordInput& inpu &output.notificationFrameCount, clientUid, &output.flags, input.clientInfo.clientTid, &lStatus, portId); &lStatus, portId, input.opPackageName); LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0)); // lStatus == BAD_TYPE means FAST flag was rejected: request a new input from Loading
services/audioflinger/AudioFlinger.h +2 −0 Original line number Diff line number Diff line Loading @@ -48,7 +48,9 @@ #include <utils/TypeHelpers.h> #include <utils/Vector.h> #include <binder/AppOpsManager.h> #include <binder/BinderService.h> #include <binder/IAppOpsCallback.h> #include <binder/MemoryDealer.h> #include <system/audio.h> Loading
services/audioflinger/RecordTracks.h +40 −1 Original line number Diff line number Diff line Loading @@ -19,6 +19,39 @@ #error This header file should only be included from AudioFlinger.h #endif // Checks and monitors OP_RECORD_AUDIO class OpRecordAudioMonitor : public RefBase { public: ~OpRecordAudioMonitor() override; bool hasOpRecordAudio() const; static sp<OpRecordAudioMonitor> createIfNeeded(uid_t uid, const String16& opPackageName); private: OpRecordAudioMonitor(uid_t uid, const String16& opPackageName); void onFirstRef() override; AppOpsManager mAppOpsManager; class RecordAudioOpCallback : public BnAppOpsCallback { public: explicit RecordAudioOpCallback(const wp<OpRecordAudioMonitor>& monitor); void opChanged(int32_t op, const String16& packageName) override; private: const wp<OpRecordAudioMonitor> mMonitor; }; sp<RecordAudioOpCallback> mOpCallback; // called by RecordAudioOpCallback when OP_RECORD_AUDIO is updated in AppOp callback // and in onFirstRef() void checkRecordAudio(); std::atomic_bool mHasOpRecordAudio; const uid_t mUid; const String16 mPackage; }; // record track class RecordTrack : public TrackBase { public: Loading @@ -35,6 +68,7 @@ public: uid_t uid, audio_input_flags_t flags, track_type type, const String16& opPackageName, audio_port_handle_t portId = AUDIO_PORT_HANDLE_NONE); virtual ~RecordTrack(); virtual status_t initCheck() const; Loading Loading @@ -65,7 +99,7 @@ public: virtual bool isFastTrack() const { return (mFlags & AUDIO_INPUT_FLAG_FAST) != 0; } void setSilenced(bool silenced) { if (!isPatchTrack()) mSilenced = silenced; } bool isSilenced() const { return mSilenced; } bool isSilenced() const; status_t getActiveMicrophones(std::vector<media::MicrophoneInfo>* activeMicrophones); Loading Loading @@ -99,6 +133,11 @@ private: audio_input_flags_t mFlags; bool mSilenced; // used to enforce OP_RECORD_AUDIO uid_t mUid; String16 mOpPackageName; sp<OpRecordAudioMonitor> mOpRecordAudioMonitor; }; // playback track, used by PatchPanel Loading
services/audioflinger/ServiceUtilities.h +9 −0 Original line number Diff line number Diff line Loading @@ -14,12 +14,21 @@ * limitations under the License. */ #include <cutils/multiuser.h> #include <private/android_filesystem_config.h> #include <unistd.h> #include <binder/PermissionController.h> namespace android { // Used for calls that should originate from system services. // We allow that some services might have separate processes to // handle multiple users, e.g. u10_system, u10_bluetooth, u10_radio. static inline bool isServiceUid(uid_t uid) { return multiuser_get_app_id(uid) < AID_APP_START; } extern pid_t getpid_cached; bool isTrustedCallingUid(uid_t uid); bool recordingAllowed(const String16& opPackageName, pid_t pid, uid_t uid); Loading
services/audioflinger/Threads.cpp +4 −3 Original line number Diff line number Diff line Loading @@ -6778,7 +6778,7 @@ reacquire_wakelock: // Sanitize before releasing if the track has no access to the source data // An idle UID receives silence from non virtual devices until active if (activeTrack->isSilenced()) { memset(activeTrack->mSink.raw, 0, framesOut * mFrameSize); memset(activeTrack->mSink.raw, 0, framesOut * activeTrack->frameSize()); } activeTrack->releaseBuffer(&activeTrack->mSink); } Loading Loading @@ -6921,7 +6921,8 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe audio_input_flags_t *flags, pid_t tid, status_t *status, audio_port_handle_t portId) audio_port_handle_t portId, const String16& opPackageName) { size_t frameCount = *pFrameCount; size_t notificationFrameCount = *pNotificationFrameCount; Loading Loading @@ -7047,7 +7048,7 @@ sp<AudioFlinger::RecordThread::RecordTrack> AudioFlinger::RecordThread::createRe track = new RecordTrack(this, client, attr, sampleRate, format, channelMask, frameCount, nullptr /* buffer */, (size_t)0 /* bufferSize */, sessionId, uid, *flags, TrackBase::TYPE_DEFAULT, portId); *flags, TrackBase::TYPE_DEFAULT, opPackageName, portId); lStatus = track->initCheck(); if (lStatus != NO_ERROR) { Loading