summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Michel Trivi <jmtrivi@google.com>2015-05-01 18:34:17 -0700
committerJean-Michel Trivi <jmtrivi@google.com>2015-05-05 02:04:33 +0000
commit4cb668392ee0433462251afbee109405c6efacc8 (patch)
tree50e324bd1af8951136ec9b7c4a7538e514490e80
parent1de1e25cba872bd4c077c2e394f8ca9c70b65856 (diff)
downloadframeworks_av-4cb668392ee0433462251afbee109405c6efacc8.zip
frameworks_av-4cb668392ee0433462251afbee109405c6efacc8.tar.gz
frameworks_av-4cb668392ee0433462251afbee109405c6efacc8.tar.bz2
AudioRecord keeps track of UID
Bug 20832981 Change-Id: If5f3c61fae02d86b9d6fdf411711f854fd56c77d
-rw-r--r--include/media/AudioRecord.h6
-rw-r--r--include/media/IAudioFlinger.h1
-rw-r--r--media/libmedia/AudioRecord.cpp25
-rw-r--r--media/libmedia/IAudioFlinger.cpp5
-rw-r--r--services/audioflinger/AudioFlinger.cpp4
-rw-r--r--services/audioflinger/AudioFlinger.h1
6 files changed, 36 insertions, 6 deletions
diff --git a/include/media/AudioRecord.h b/include/media/AudioRecord.h
index b743c11..4d8bd32 100644
--- a/include/media/AudioRecord.h
+++ b/include/media/AudioRecord.h
@@ -178,6 +178,8 @@ public:
int sessionId = AUDIO_SESSION_ALLOCATE,
transfer_type transferType = TRANSFER_DEFAULT,
audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
+ int uid = -1,
+ pid_t pid = -1,
const audio_attributes_t* pAttributes = NULL);
/* Terminates the AudioRecord and unregisters it from AudioFlinger.
@@ -214,6 +216,8 @@ public:
int sessionId = AUDIO_SESSION_ALLOCATE,
transfer_type transferType = TRANSFER_DEFAULT,
audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
+ int uid = -1,
+ pid_t pid = -1,
const audio_attributes_t* pAttributes = NULL);
/* Result of constructing the AudioRecord. This must be checked for successful initialization
@@ -577,6 +581,8 @@ private:
sp<DeathNotifier> mDeathNotifier;
uint32_t mSequence; // incremented for each new IAudioRecord attempt
+ int mClientUid;
+ pid_t mClientPid;
audio_attributes_t mAttributes;
// For Device Selection API
diff --git a/include/media/IAudioFlinger.h b/include/media/IAudioFlinger.h
index 046345c..3f7fd09 100644
--- a/include/media/IAudioFlinger.h
+++ b/include/media/IAudioFlinger.h
@@ -89,6 +89,7 @@ public:
size_t *pFrameCount,
track_flags_t *flags,
pid_t tid, // -1 means unused, otherwise must be valid non-0
+ int clientUid,
int *sessionId,
size_t *notificationFrames,
sp<IMemory>& cblk,
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,
&notificationFrames,
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<IMemory>& 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<IMemory> cblk;
@@ -965,7 +968,7 @@ status_t BnAudioFlinger::onTransact(
status_t status;
sp<IAudioRecord> record = openRecord(input,
sampleRate, format, channelMask, opPackageName, &frameCount, &flags, tid,
- &sessionId, &notificationFrames, cblk, buffers, &status);
+ clientUid, &sessionId, &notificationFrames, cblk, buffers, &status);
LOG_ALWAYS_FATAL_IF((record != 0) != (status == NO_ERROR));
reply->writeInt64(frameCount);
reply->writeInt32(flags);
diff --git a/services/audioflinger/AudioFlinger.cpp b/services/audioflinger/AudioFlinger.cpp
index 64e9fea..3c14e1f 100644
--- a/services/audioflinger/AudioFlinger.cpp
+++ b/services/audioflinger/AudioFlinger.cpp
@@ -1426,6 +1426,7 @@ sp<IAudioRecord> AudioFlinger::openRecord(
size_t *frameCount,
IAudioFlinger::track_flags_t *flags,
pid_t tid,
+ int clientUid,
int *sessionId,
size_t *notificationFrames,
sp<IMemory>& cblk,
@@ -1495,8 +1496,7 @@ sp<IAudioRecord> AudioFlinger::openRecord(
// TODO: the uid should be passed in as a parameter to openRecord
recordTrack = thread->createRecordTrack_l(client, sampleRate, format, channelMask,
frameCount, lSessionId, notificationFrames,
- IPCThreadState::self()->getCallingUid(),
- flags, tid, &lStatus);
+ clientUid, flags, tid, &lStatus);
LOG_ALWAYS_FATAL_IF((lStatus == NO_ERROR) && (recordTrack == 0));
if (lStatus == NO_ERROR) {
diff --git a/services/audioflinger/AudioFlinger.h b/services/audioflinger/AudioFlinger.h
index 34ec2b1..72db62b 100644
--- a/services/audioflinger/AudioFlinger.h
+++ b/services/audioflinger/AudioFlinger.h
@@ -124,6 +124,7 @@ public:
size_t *pFrameCount,
IAudioFlinger::track_flags_t *flags,
pid_t tid,
+ int clientUid,
int *sessionId,
size_t *notificationFrames,
sp<IMemory>& cblk,