From 4cb668392ee0433462251afbee109405c6efacc8 Mon Sep 17 00:00:00 2001 From: Jean-Michel Trivi Date: Fri, 1 May 2015 18:34:17 -0700 Subject: AudioRecord keeps track of UID Bug 20832981 Change-Id: If5f3c61fae02d86b9d6fdf411711f854fd56c77d --- media/libmedia/AudioRecord.cpp | 25 ++++++++++++++++++++++--- media/libmedia/IAudioFlinger.cpp | 5 ++++- 2 files changed, 26 insertions(+), 4 deletions(-) (limited to 'media') diff --git a/media/libmedia/AudioRecord.cpp b/media/libmedia/AudioRecord.cpp index 23015c0..a4d6c7d 100644 --- a/media/libmedia/AudioRecord.cpp +++ b/media/libmedia/AudioRecord.cpp @@ -85,6 +85,8 @@ AudioRecord::AudioRecord( int sessionId, transfer_type transferType, audio_input_flags_t flags, + int uid, + pid_t pid, const audio_attributes_t* pAttributes) : mStatus(NO_INIT), mOpPackageName(opPackageName), @@ -96,7 +98,7 @@ AudioRecord::AudioRecord( { mStatus = set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user, notificationFrames, false /*threadCanCallJava*/, sessionId, transferType, flags, - pAttributes); + uid, pid, pAttributes); } AudioRecord::~AudioRecord() @@ -136,12 +138,15 @@ status_t AudioRecord::set( int sessionId, transfer_type transferType, audio_input_flags_t flags, + int uid, + pid_t pid, const audio_attributes_t* pAttributes) { ALOGV("set(): inputSource %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, " - "notificationFrames %u, sessionId %d, transferType %d, flags %#x, opPackageName %s", + "notificationFrames %u, sessionId %d, transferType %d, flags %#x, opPackageName %s " + "uid %d, pid %d", inputSource, sampleRate, format, channelMask, frameCount, notificationFrames, - sessionId, transferType, flags, String8(mOpPackageName).string()); + sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid); switch (transferType) { case TRANSFER_DEFAULT: @@ -228,6 +233,19 @@ status_t AudioRecord::set( } ALOGV("set(): mSessionId %d", mSessionId); + int callingpid = IPCThreadState::self()->getCallingPid(); + int mypid = getpid(); + if (uid == -1 || (callingpid != mypid)) { + mClientUid = IPCThreadState::self()->getCallingUid(); + } else { + mClientUid = uid; + } + if (pid == -1 || (callingpid != mypid)) { + mClientPid = callingpid; + } else { + mClientPid = pid; + } + mFlags = flags; mCbf = cbf; @@ -513,6 +531,7 @@ status_t AudioRecord::openRecord_l(size_t epoch, const String16& opPackageName) &temp, &trackFlags, tid, + mClientUid, &mSessionId, ¬ificationFrames, iMem, diff --git a/media/libmedia/IAudioFlinger.cpp b/media/libmedia/IAudioFlinger.cpp index d48532e..d722fe9 100644 --- a/media/libmedia/IAudioFlinger.cpp +++ b/media/libmedia/IAudioFlinger.cpp @@ -178,6 +178,7 @@ public: size_t *pFrameCount, track_flags_t *flags, pid_t tid, + int clientUid, int *sessionId, size_t *notificationFrames, sp& cblk, @@ -197,6 +198,7 @@ public: track_flags_t lFlags = flags != NULL ? *flags : (track_flags_t) TRACK_DEFAULT; data.writeInt32(lFlags); data.writeInt32((int32_t) tid); + data.writeInt32((int32_t) clientUid); int lSessionId = AUDIO_SESSION_ALLOCATE; if (sessionId != NULL) { lSessionId = *sessionId; @@ -958,6 +960,7 @@ status_t BnAudioFlinger::onTransact( size_t frameCount = data.readInt64(); track_flags_t flags = (track_flags_t) data.readInt32(); pid_t tid = (pid_t) data.readInt32(); + int clientUid = data.readInt32(); int sessionId = data.readInt32(); size_t notificationFrames = data.readInt64(); sp cblk; @@ -965,7 +968,7 @@ status_t BnAudioFlinger::onTransact( status_t status; sp record = openRecord(input, sampleRate, format, channelMask, opPackageName, &frameCount, &flags, tid, - &sessionId, ¬ificationFrames, cblk, buffers, &status); + clientUid, &sessionId, ¬ificationFrames, cblk, buffers, &status); LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR)); reply->writeInt64(frameCount); reply->writeInt32(flags); -- cgit v1.1