Add attributionTag to audio-recordings
... by replacing packageName/uid/pid by the Identity class.
This allows us to track which parts of the app trigger audio-recordings.
90% of the code is just sending around the additional parameters.
This adds it for the Java and native API.
Test: atest CtsAppOpsTestCases
CtsNativeMediaAAudioTestCases
Fixes: 160150145
Change-Id: Ibd7b884f7fcd4668a4e27f997e59cfc3217a9e89
diff --git a/media/libaaudio/include/aaudio/AAudio.h b/media/libaaudio/include/aaudio/AAudio.h
index 9072886..22cf254 100644
--- a/media/libaaudio/include/aaudio/AAudio.h
+++ b/media/libaaudio/include/aaudio/AAudio.h
@@ -580,6 +580,37 @@
AAUDIO_API void AAudioStreamBuilder_setDeviceId(AAudioStreamBuilder* builder,
int32_t deviceId) __INTRODUCED_IN(26);
+// TODO b/182392769: reexamine if Identity can be used
+/**
+ * Declare the name of the package creating the stream.
+ *
+ * This is usually {@code Context#getPackageName()}.
+ *
+ * The default, if you do not call this function, is a random package in the calling uid.
+ *
+ * Available since API level 31.
+ *
+ * @param builder reference provided by AAudio_createStreamBuilder()
+ * @param packageName packageName of the calling app.
+ */
+AAUDIO_API void AAudioStreamBuilder_setPackageName(AAudioStreamBuilder* builder,
+ const char * packageName) __INTRODUCED_IN(31);
+
+/**
+ * Declare the attribution tag of the context creating the stream.
+ *
+ * This is usually {@code Context#getAttributionTag()}.
+ *
+ * The default, if you do not call this function, is the default attribution tag.
+ *
+ * Available since API level 31.
+ *
+ * @param builder reference provided by AAudio_createStreamBuilder()
+ * @param attributionTag attributionTag of the calling context.
+ */
+AAUDIO_API void AAudioStreamBuilder_setAttributionTag(AAudioStreamBuilder* builder,
+ const char * attributionTag) __INTRODUCED_IN(31);
+
/**
* Request a sample rate in Hertz.
*
diff --git a/media/libaaudio/src/Android.bp b/media/libaaudio/src/Android.bp
index 47cbbb1..fe2d98e 100644
--- a/media/libaaudio/src/Android.bp
+++ b/media/libaaudio/src/Android.bp
@@ -85,6 +85,10 @@
],
export_header_lib_headers: ["libaaudio_headers"],
+ export_shared_lib_headers: [
+ "media_permission-aidl-cpp",
+ ],
+
shared_libs: [
"libaudioclient",
"libaudioutils",
@@ -96,6 +100,12 @@
"libutils",
"libbinder",
"aaudio-aidl-cpp",
+ "media_permission-aidl-cpp",
+ "libaudioclient_aidl_conversion",
+ ],
+
+ static_libs: [
+ "media_permission-aidl-cpp",
],
cflags: [
@@ -167,6 +177,7 @@
imports: [
"audio_common-aidl",
"shared-file-region-aidl",
+ "media_permission-aidl",
],
backend:
{
diff --git a/media/libaaudio/src/binding/AAudioStreamRequest.cpp b/media/libaaudio/src/binding/AAudioStreamRequest.cpp
index 536395a..5e0a4bb 100644
--- a/media/libaaudio/src/binding/AAudioStreamRequest.cpp
+++ b/media/libaaudio/src/binding/AAudioStreamRequest.cpp
@@ -31,19 +31,15 @@
AAudioStreamRequest::AAudioStreamRequest(const StreamRequest& parcelable) :
mConfiguration(std::move(parcelable.params)),
- mUserId(parcelable.userId),
- mProcessId(parcelable.processId),
+ mIdentity(parcelable.identity),
mSharingModeMatchRequired(parcelable.sharingModeMatchRequired),
mInService(parcelable.inService) {
- static_assert(sizeof(mUserId) == sizeof(parcelable.userId));
- static_assert(sizeof(mProcessId) == sizeof(parcelable.processId));
}
StreamRequest AAudioStreamRequest::parcelable() const {
StreamRequest result;
result.params = std::move(mConfiguration).parcelable();
- result.userId = mUserId;
- result.processId = mProcessId;
+ result.identity = mIdentity;
result.sharingModeMatchRequired = mSharingModeMatchRequired;
result.inService = mInService;
return result;
@@ -54,8 +50,7 @@
}
void AAudioStreamRequest::dump() const {
- ALOGD("mUserId = %d", mUserId);
- ALOGD("mProcessId = %d", mProcessId);
+ ALOGD("mIdentity = %s", mIdentity.toString().c_str());
ALOGD("mSharingModeMatchRequired = %d", mSharingModeMatchRequired);
ALOGD("mInService = %d", mInService);
mConfiguration.dump();
diff --git a/media/libaaudio/src/binding/AAudioStreamRequest.h b/media/libaaudio/src/binding/AAudioStreamRequest.h
index 31d3ea1..02341c8 100644
--- a/media/libaaudio/src/binding/AAudioStreamRequest.h
+++ b/media/libaaudio/src/binding/AAudioStreamRequest.h
@@ -23,6 +23,7 @@
#include <aaudio/StreamRequest.h>
#include "binding/AAudioStreamConfiguration.h"
+#include <android/media/permission/Identity.h>
namespace aaudio {
@@ -33,20 +34,12 @@
// Construct based on a parcelable representation.
explicit AAudioStreamRequest(const StreamRequest& parcelable);
- uid_t getUserId() const {
- return mUserId;
+ const android::media::permission::Identity &getIdentity() const {
+ return mIdentity;
}
- void setUserId(uid_t userId) {
- mUserId = userId;
- }
-
- pid_t getProcessId() const {
- return mProcessId;
- }
-
- void setProcessId(pid_t processId) {
- mProcessId = processId;
+ void setIdentity(const android::media::permission::Identity &identity) {
+ mIdentity = identity;
}
bool isSharingModeMatchRequired() const {
@@ -82,8 +75,7 @@
private:
AAudioStreamConfiguration mConfiguration;
- uid_t mUserId = (uid_t) -1;
- pid_t mProcessId = (pid_t) -1;
+ android::media::permission::Identity mIdentity;
bool mSharingModeMatchRequired = false;
bool mInService = false; // Stream opened by AAudioservice
};
diff --git a/media/libaaudio/src/binding/aidl/aaudio/StreamRequest.aidl b/media/libaaudio/src/binding/aidl/aaudio/StreamRequest.aidl
index 9bf4077..12802e6 100644
--- a/media/libaaudio/src/binding/aidl/aaudio/StreamRequest.aidl
+++ b/media/libaaudio/src/binding/aidl/aaudio/StreamRequest.aidl
@@ -17,11 +17,11 @@
package aaudio;
import aaudio.StreamParameters;
+import android.media.permission.Identity;
parcelable StreamRequest {
StreamParameters params;
- int userId; // = (uid_t) -1;
- int processId; // = (pid_t) -1;
+ Identity identity;
boolean sharingModeMatchRequired; // = false;
boolean inService; // = false; // Stream opened by AAudioservice
}
\ No newline at end of file
diff --git a/media/libaaudio/src/client/AudioStreamInternal.cpp b/media/libaaudio/src/client/AudioStreamInternal.cpp
index 2815c6a..dc961ad 100644
--- a/media/libaaudio/src/client/AudioStreamInternal.cpp
+++ b/media/libaaudio/src/client/AudioStreamInternal.cpp
@@ -28,7 +28,6 @@
#include <cutils/properties.h>
#include <media/MediaMetricsItem.h>
-#include <utils/String16.h>
#include <utils/Trace.h>
#include "AudioEndpointParcelable.h"
@@ -39,6 +38,7 @@
#include "core/AudioStreamBuilder.h"
#include "fifo/FifoBuffer.h"
#include "utility/AudioClock.h"
+#include <media/AidlConversion.h>
#include "AudioStreamInternal.h"
@@ -49,9 +49,9 @@
// This is needed to make sense of the logs more easily.
#define LOG_TAG (mInService ? "AudioStreamInternal_Service" : "AudioStreamInternal_Client")
-using android::String16;
using android::Mutex;
using android::WrappingBuffer;
+using android::media::permission::Identity;
using namespace aaudio;
@@ -107,9 +107,15 @@
// Request FLOAT for the shared mixer or the device.
request.getConfiguration().setFormat(AUDIO_FORMAT_PCM_FLOAT);
+ // TODO b/182392769: use identity util
+ Identity identity;
+ identity.uid = VALUE_OR_FATAL(android::legacy2aidl_uid_t_int32_t(getuid()));
+ identity.pid = VALUE_OR_FATAL(android::legacy2aidl_pid_t_int32_t(getpid()));
+ identity.packageName = builder.getOpPackageName();
+ identity.attributionTag = builder.getAttributionTag();
+
// Build the request to send to the server.
- request.setUserId(getuid());
- request.setProcessId(getpid());
+ request.setIdentity(identity);
request.setSharingModeMatchRequired(isSharingModeMatchRequired());
request.setInService(isInService());
diff --git a/media/libaaudio/src/core/AAudioAudio.cpp b/media/libaaudio/src/core/AAudioAudio.cpp
index 7c16321..5d49759 100644
--- a/media/libaaudio/src/core/AAudioAudio.cpp
+++ b/media/libaaudio/src/core/AAudioAudio.cpp
@@ -87,6 +87,22 @@
streamBuilder->setDeviceId(deviceId);
}
+AAUDIO_API void AAudioStreamBuilder_setPackageName(AAudioStreamBuilder* builder,
+ const char* packageName)
+{
+ AudioStreamBuilder *streamBuilder = convertAAudioBuilderToStreamBuilder(builder);
+ // Only system apps can read the op package name. For regular apps the regular package name
+ // is a sufficient replacement
+ streamBuilder->setOpPackageName(packageName);
+}
+
+AAUDIO_API void AAudioStreamBuilder_setAttributionTag(AAudioStreamBuilder* builder,
+ const char* attributionTag)
+{
+ AudioStreamBuilder *streamBuilder = convertAAudioBuilderToStreamBuilder(builder);
+ streamBuilder->setAttributionTag(attributionTag);
+}
+
AAUDIO_API void AAudioStreamBuilder_setSampleRate(AAudioStreamBuilder* builder,
int32_t sampleRate)
{
diff --git a/media/libaaudio/src/core/AAudioStreamParameters.cpp b/media/libaaudio/src/core/AAudioStreamParameters.cpp
index 2c81c91..0d60120 100644
--- a/media/libaaudio/src/core/AAudioStreamParameters.cpp
+++ b/media/libaaudio/src/core/AAudioStreamParameters.cpp
@@ -48,6 +48,8 @@
mInputPreset = other.mInputPreset;
mAllowedCapturePolicy = other.mAllowedCapturePolicy;
mIsPrivacySensitive = other.mIsPrivacySensitive;
+ mOpPackageName = other.mOpPackageName;
+ mAttributionTag = other.mAttributionTag;
}
static aaudio_result_t isFormatValid(audio_format_t format) {
@@ -203,4 +205,8 @@
ALOGD("mInputPreset = %6d", mInputPreset);
ALOGD("mAllowedCapturePolicy = %6d", mAllowedCapturePolicy);
ALOGD("mIsPrivacySensitive = %s", mIsPrivacySensitive ? "true" : "false");
+ ALOGD("mOpPackageName = %s", !mOpPackageName.has_value() ?
+ "(null)" : mOpPackageName.value().c_str());
+ ALOGD("mAttributionTag = %s", !mAttributionTag.has_value() ?
+ "(null)" : mAttributionTag.value().c_str());
}
diff --git a/media/libaaudio/src/core/AAudioStreamParameters.h b/media/libaaudio/src/core/AAudioStreamParameters.h
index 3e65b37..bb39d8b 100644
--- a/media/libaaudio/src/core/AAudioStreamParameters.h
+++ b/media/libaaudio/src/core/AAudioStreamParameters.h
@@ -136,6 +136,23 @@
mIsPrivacySensitive = privacySensitive;
}
+ const std::optional<std::string> getOpPackageName() const {
+ return mOpPackageName;
+ }
+
+ // TODO b/182392769: reexamine if Identity can be used
+ void setOpPackageName(const std::string opPackageName) {
+ mOpPackageName = opPackageName;
+ }
+
+ const std::optional<std::string> getAttributionTag() const {
+ return mAttributionTag;
+ }
+
+ void setAttributionTag(const std::string attributionTag) {
+ mAttributionTag = attributionTag;
+ }
+
/**
* @return bytes per frame of getFormat()
*/
@@ -167,6 +184,8 @@
aaudio_allowed_capture_policy_t mAllowedCapturePolicy = AAUDIO_UNSPECIFIED;
aaudio_session_id_t mSessionId = AAUDIO_SESSION_ID_NONE;
bool mIsPrivacySensitive = false;
+ std::optional<std::string> mOpPackageName = {};
+ std::optional<std::string> mAttributionTag = {};
};
} /* namespace aaudio */
diff --git a/media/libaaudio/src/core/AudioStreamBuilder.cpp b/media/libaaudio/src/core/AudioStreamBuilder.cpp
index 50a3b38..207a8e3 100644
--- a/media/libaaudio/src/core/AudioStreamBuilder.cpp
+++ b/media/libaaudio/src/core/AudioStreamBuilder.cpp
@@ -282,4 +282,8 @@
ALOGI("usage = %6d, contentType = %d, inputPreset = %d, allowedCapturePolicy = %d",
getUsage(), getContentType(), getInputPreset(), getAllowedCapturePolicy());
ALOGI("privacy sensitive = %s", isPrivacySensitive() ? "true" : "false");
+ ALOGI("opPackageName = %s", !getOpPackageName().has_value() ?
+ "(null)" : getOpPackageName().value().c_str());
+ ALOGI("attributionTag = %s", !getAttributionTag().has_value() ?
+ "(null)" : getAttributionTag().value().c_str());
}
diff --git a/media/libaaudio/src/legacy/AudioStreamRecord.cpp b/media/libaaudio/src/legacy/AudioStreamRecord.cpp
index 45b2258..7733a04 100644
--- a/media/libaaudio/src/legacy/AudioStreamRecord.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamRecord.cpp
@@ -22,6 +22,7 @@
#include <aaudio/AAudio.h>
#include <audio_utils/primitives.h>
+#include <media/AidlConversion.h>
#include <media/AudioRecord.h>
#include <utils/String16.h>
@@ -30,6 +31,8 @@
#include "utility/AudioClock.h"
#include "utility/FixedBlockWriter.h"
+using android::media::permission::Identity;
+
using namespace android;
using namespace aaudio;
@@ -152,13 +155,20 @@
.tags = ""
};
+ // TODO b/182392769: use identity util
+ Identity identity;
+ identity.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(getuid()));
+ identity.pid = VALUE_OR_FATAL(legacy2aidl_pid_t_int32_t(getpid()));
+ identity.packageName = builder.getOpPackageName();
+ identity.attributionTag = builder.getAttributionTag();
+
// ----------- open the AudioRecord ---------------------
// Might retry, but never more than once.
for (int i = 0; i < 2; i ++) {
const audio_format_t requestedInternalFormat = getDeviceFormat();
mAudioRecord = new AudioRecord(
- mOpPackageName // const String16& opPackageName TODO does not compile
+ identity
);
mAudioRecord->set(
AUDIO_SOURCE_DEFAULT, // ignored because we pass attributes below
diff --git a/media/libaaudio/src/legacy/AudioStreamRecord.h b/media/libaaudio/src/legacy/AudioStreamRecord.h
index b2f8ba5..7d0a197 100644
--- a/media/libaaudio/src/legacy/AudioStreamRecord.h
+++ b/media/libaaudio/src/legacy/AudioStreamRecord.h
@@ -25,6 +25,7 @@
#include "AAudioLegacy.h"
#include "legacy/AudioStreamLegacy.h"
#include "utility/FixedBlockWriter.h"
+#include <android/media/permission/Identity.h>
namespace aaudio {
@@ -86,7 +87,7 @@
FixedBlockWriter mFixedBlockWriter;
// TODO add 64-bit position reporting to AudioRecord and use it.
- android::String16 mOpPackageName;
+ android::media::permission::Identity mIdentity;
// Only one type of conversion buffer is used.
std::unique_ptr<float[]> mFormatConversionBufferFloat;
diff --git a/media/libaaudio/src/legacy/AudioStreamTrack.cpp b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
index af8ff19..142a85c 100644
--- a/media/libaaudio/src/legacy/AudioStreamTrack.cpp
+++ b/media/libaaudio/src/legacy/AudioStreamTrack.cpp
@@ -31,6 +31,8 @@
using namespace android;
using namespace aaudio;
+using media::permission::Identity;
+
// Arbitrary and somewhat generous number of bursts.
#define DEFAULT_BURSTS_PER_BUFFER_CAPACITY 8
@@ -147,6 +149,7 @@
};
mAudioTrack = new AudioTrack();
+ // TODO b/182392769: use identity util
mAudioTrack->set(
AUDIO_STREAM_DEFAULT, // ignored because we pass attributes below
getSampleRate(),
@@ -162,8 +165,7 @@
sessionId,
streamTransferType,
NULL, // DEFAULT audio_offload_info_t
- AUDIO_UID_INVALID, // DEFAULT uid
- -1, // DEFAULT pid
+ Identity(), // DEFAULT uid and pid
&attributes,
// WARNING - If doNotReconnect set true then audio stops after plugging and unplugging
// headphones a few times.
diff --git a/media/libaaudio/src/libaaudio.map.txt b/media/libaaudio/src/libaaudio.map.txt
index 2e00aa5..1dd44d1 100644
--- a/media/libaaudio/src/libaaudio.map.txt
+++ b/media/libaaudio/src/libaaudio.map.txt
@@ -23,6 +23,8 @@
AAudioStreamBuilder_setAllowedCapturePolicy; # introduced=29
AAudioStreamBuilder_setSessionId; # introduced=28
AAudioStreamBuilder_setPrivacySensitive; # introduced=30
+ AAudioStreamBuilder_setPackageName; # introduced=31
+ AAudioStreamBuilder_setAttributionTag; # introduced=31
AAudioStreamBuilder_openStream;
AAudioStreamBuilder_delete;
AAudioStream_close;
diff --git a/media/libaudioclient/AidlConversion.cpp b/media/libaudioclient/AidlConversion.cpp
index 4c0db3e..05ba55f 100644
--- a/media/libaudioclient/AidlConversion.cpp
+++ b/media/libaudioclient/AidlConversion.cpp
@@ -190,6 +190,27 @@
return std::string(String8(legacy).c_str());
}
+// TODO b/182392769: create an optional -> optional util
+ConversionResult<std::optional<String16>>
+aidl2legacy_optional_string_view_optional_String16(std::optional<std::string_view> aidl) {
+ if (!aidl.has_value()) {
+ return std::nullopt;
+ }
+ ConversionResult<String16> conversion =
+ VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.value()));
+ return conversion.value();
+}
+
+ConversionResult<std::optional<std::string_view>>
+legacy2aidl_optional_String16_optional_string(std::optional<String16> legacy) {
+ if (!legacy.has_value()) {
+ return std::nullopt;
+ }
+ ConversionResult<std::string> conversion =
+ VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.value()));
+ return conversion.value();
+}
+
ConversionResult<String8> aidl2legacy_string_view_String8(std::string_view aidl) {
return String8(aidl.data(), aidl.size());
}
@@ -1160,20 +1181,16 @@
ConversionResult<AudioClient> aidl2legacy_AudioClient_AudioClient(
const media::AudioClient& aidl) {
AudioClient legacy;
- legacy.clientUid = VALUE_OR_RETURN(aidl2legacy_int32_t_uid_t(aidl.clientUid));
- legacy.clientPid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientPid));
legacy.clientTid = VALUE_OR_RETURN(aidl2legacy_int32_t_pid_t(aidl.clientTid));
- legacy.packageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.packageName));
+ legacy.identity = aidl.identity;
return legacy;
}
ConversionResult<media::AudioClient> legacy2aidl_AudioClient_AudioClient(
const AudioClient& legacy) {
media::AudioClient aidl;
- aidl.clientUid = VALUE_OR_RETURN(legacy2aidl_uid_t_int32_t(legacy.clientUid));
- aidl.clientPid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientPid));
aidl.clientTid = VALUE_OR_RETURN(legacy2aidl_pid_t_int32_t(legacy.clientTid));
- aidl.packageName = VALUE_OR_RETURN(legacy2aidl_String16_string(legacy.packageName));
+ aidl.identity = legacy.identity;
return aidl;
}
diff --git a/media/libaudioclient/Android.bp b/media/libaudioclient/Android.bp
index 79c155e..d25597d 100644
--- a/media/libaudioclient/Android.bp
+++ b/media/libaudioclient/Android.bp
@@ -132,10 +132,12 @@
"libshmemcompat",
"libutils",
"libvibrator",
+ "media_permission-aidl-cpp",
],
export_shared_lib_headers: [
"audioflinger-aidl-cpp",
"audiopolicy-aidl-cpp",
+ "media_permission-aidl-cpp",
"libbinder",
],
@@ -162,6 +164,7 @@
// for memory heap analysis
"libc_malloc_debug_backtrace",
"shared-file-region-aidl-cpp",
+ "media_permission-aidl-cpp",
],
cflags: [
"-Wall",
@@ -229,6 +232,7 @@
"libshmemcompat",
"libutils",
"shared-file-region-aidl-cpp",
+ "media_permission-aidl-cpp",
],
export_shared_lib_headers: [
"audioclient-types-aidl-cpp",
@@ -346,6 +350,7 @@
],
imports: [
"audio_common-aidl",
+ "media_permission-aidl",
],
backend: {
cpp: {
@@ -427,6 +432,7 @@
"av-types-aidl",
"effect-aidl",
"shared-file-region-aidl",
+ "media_permission-aidl",
],
double_loadable: true,
backend: {
@@ -460,6 +466,7 @@
"audioclient-types-aidl",
"audiopolicy-types-aidl",
"capture_state_listener-aidl",
+ "media_permission-aidl",
],
double_loadable: true,
backend: {
diff --git a/media/libaudioclient/AudioEffect.cpp b/media/libaudioclient/AudioEffect.cpp
index ad8ad7b..d5047b1 100644
--- a/media/libaudioclient/AudioEffect.cpp
+++ b/media/libaudioclient/AudioEffect.cpp
@@ -42,6 +42,7 @@
using aidl_utils::statusTFromBinderStatus;
using binder::Status;
using media::IAudioPolicyService;
+using media::permission::Identity;
namespace {
@@ -57,8 +58,8 @@
// ---------------------------------------------------------------------------
-AudioEffect::AudioEffect(const String16& opPackageName)
- : mOpPackageName(opPackageName)
+AudioEffect::AudioEffect(const Identity& identity)
+ : mClientIdentity(identity)
{
}
@@ -107,9 +108,12 @@
mDescriptor.type = *(type != NULL ? type : EFFECT_UUID_NULL);
mDescriptor.uuid = *(uuid != NULL ? uuid : EFFECT_UUID_NULL);
+ // TODO b/182392769: use identity util
mIEffectClient = new EffectClient(this);
- mClientPid = IPCThreadState::self()->getCallingPid();
- mClientUid = IPCThreadState::self()->getCallingUid();
+ pid_t pid = IPCThreadState::self()->getCallingPid();
+ mClientIdentity.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(pid));
+ pid_t uid = IPCThreadState::self()->getCallingUid();
+ mClientIdentity.uid = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
media::CreateEffectRequest request;
request.desc = VALUE_OR_RETURN_STATUS(
@@ -119,8 +123,7 @@
request.output = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(io));
request.sessionId = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(mSessionId));
request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(device));
- request.opPackageName = VALUE_OR_RETURN_STATUS(legacy2aidl_String16_string(mOpPackageName));
- request.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(mClientPid));
+ request.identity = mClientIdentity;
request.probe = probe;
media::CreateEffectResponse response;
@@ -175,10 +178,10 @@
IInterface::asBinder(iEffect)->linkToDeath(mIEffectClient);
ALOGV("set() %p OK effect: %s id: %d status %d enabled %d pid %d", this, mDescriptor.name, mId,
- mStatus, mEnabled, mClientPid);
+ mStatus, mEnabled, mClientIdentity.pid);
if (!audio_is_global_session(mSessionId)) {
- AudioSystem::acquireAudioSessionId(mSessionId, mClientPid, mClientUid);
+ AudioSystem::acquireAudioSessionId(mSessionId, pid, uid);
}
return mStatus;
@@ -219,7 +222,8 @@
if (!mProbe && (mStatus == NO_ERROR || mStatus == ALREADY_EXISTS)) {
if (!audio_is_global_session(mSessionId)) {
- AudioSystem::releaseAudioSessionId(mSessionId, mClientPid);
+ AudioSystem::releaseAudioSessionId(mSessionId,
+ VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mClientIdentity.pid)));
}
if (mIEffect != NULL) {
mIEffect->disconnect();
diff --git a/media/libaudioclient/AudioRecord.cpp b/media/libaudioclient/AudioRecord.cpp
index a53e664..e15ef3d 100644
--- a/media/libaudioclient/AudioRecord.cpp
+++ b/media/libaudioclient/AudioRecord.cpp
@@ -38,6 +38,8 @@
#define WAIT_PERIOD_MS 10
namespace android {
+
+using android::media::permission::Identity;
using aidl_utils::statusTFromBinderStatus;
// ---------------------------------------------------------------------------
@@ -124,9 +126,8 @@
return NO_ERROR;
}
-AudioRecord::AudioRecord(const String16 &opPackageName)
- : mActive(false), mStatus(NO_INIT), mOpPackageName(opPackageName),
- mSessionId(AUDIO_SESSION_ALLOCATE),
+AudioRecord::AudioRecord(const Identity &client)
+ : mActive(false), mStatus(NO_INIT), mClientIdentity(client), mSessionId(AUDIO_SESSION_ALLOCATE),
mPreviousPriority(ANDROID_PRIORITY_NORMAL), mPreviousSchedulingGroup(SP_DEFAULT),
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE), mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE),
mSelectedMicDirection(MIC_DIRECTION_UNSPECIFIED),
@@ -139,7 +140,7 @@
uint32_t sampleRate,
audio_format_t format,
audio_channel_mask_t channelMask,
- const String16& opPackageName,
+ const Identity& client,
size_t frameCount,
callback_t cbf,
void* user,
@@ -147,24 +148,24 @@
audio_session_t sessionId,
transfer_type transferType,
audio_input_flags_t flags,
- uid_t uid,
- pid_t pid,
const audio_attributes_t* pAttributes,
audio_port_handle_t selectedDeviceId,
audio_microphone_direction_t selectedMicDirection,
float microphoneFieldDimension)
: mActive(false),
mStatus(NO_INIT),
- mOpPackageName(opPackageName),
+ mClientIdentity(client),
mSessionId(AUDIO_SESSION_ALLOCATE),
mPreviousPriority(ANDROID_PRIORITY_NORMAL),
mPreviousSchedulingGroup(SP_DEFAULT),
mProxy(NULL)
{
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(mClientIdentity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mClientIdentity.pid));
(void)set(inputSource, sampleRate, format, channelMask, frameCount, cbf, user,
notificationFrames, false /*threadCanCallJava*/, sessionId, transferType, flags,
- uid, pid, pAttributes, selectedDeviceId,
- selectedMicDirection, microphoneFieldDimension);
+ uid, pid, pAttributes, selectedDeviceId, selectedMicDirection,
+ microphoneFieldDimension);
}
AudioRecord::~AudioRecord()
@@ -202,7 +203,8 @@
IPCThreadState::self()->flushCommands();
ALOGV("%s(%d): releasing session id %d",
__func__, mPortId, mSessionId);
- AudioSystem::releaseAudioSessionId(mSessionId, mClientPid);
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mClientIdentity.pid));
+ AudioSystem::releaseAudioSessionId(mSessionId, pid);
}
}
@@ -228,16 +230,29 @@
{
status_t status = NO_ERROR;
uint32_t channelCount;
- pid_t callingPid;
- pid_t myPid;
// Note mPortId is not valid until the track is created, so omit mPortId in ALOG for set.
ALOGV("%s(): 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, identity %s"
"uid %d, pid %d",
__func__,
inputSource, sampleRate, format, channelMask, frameCount, notificationFrames,
- sessionId, transferType, flags, String8(mOpPackageName).string(), uid, pid);
+ sessionId, transferType, flags, mClientIdentity.toString().c_str(), uid, pid);
+
+ // TODO b/182392553: refactor or remove
+ pid_t callingPid = IPCThreadState::self()->getCallingPid();
+ pid_t myPid = getpid();
+ pid_t adjPid = pid;
+ if (pid == -1 || (callingPid != myPid)) {
+ adjPid = callingPid;
+ }
+ mClientIdentity.pid = VALUE_OR_FATAL(legacy2aidl_pid_t_int32_t(adjPid));
+
+ uid_t adjUid = uid;
+ if (uid == -1 || (callingPid != myPid)) {
+ adjUid = IPCThreadState::self()->getCallingUid();
+ }
+ mClientIdentity.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(adjUid));
mTracker.reset(new RecordingActivityTracker());
@@ -332,19 +347,6 @@
mSessionId = sessionId;
ALOGV("%s(): mSessionId %d", __func__, mSessionId);
- callingPid = IPCThreadState::self()->getCallingPid();
- myPid = getpid();
- if (uid == AUDIO_UID_INVALID || (callingPid != myPid)) {
- mClientUid = IPCThreadState::self()->getCallingUid();
- } else {
- mClientUid = uid;
- }
- if (pid == -1 || (callingPid != myPid)) {
- mClientPid = callingPid;
- } else {
- mClientPid = pid;
- }
-
mOrigFlags = mFlags = flags;
mCbf = cbf;
@@ -357,7 +359,7 @@
// create the IAudioRecord
{
AutoMutex lock(mLock);
- status = createRecord_l(0 /*epoch*/, mOpPackageName);
+ status = createRecord_l(0 /*epoch*/);
}
ALOGV("%s(%d): status %d", __func__, mPortId, status);
@@ -378,7 +380,7 @@
mMarkerReached = false;
mNewPosition = 0;
mUpdatePeriod = 0;
- AudioSystem::acquireAudioSessionId(mSessionId, mClientPid, mClientUid);
+ AudioSystem::acquireAudioSessionId(mSessionId, adjPid, adjUid);
mSequence = 1;
mObservedSequence = mSequence;
mInOverrun = false;
@@ -735,7 +737,7 @@
}
// must be called with mLock held
-status_t AudioRecord::createRecord_l(const Modulo<uint32_t> &epoch, const String16& opPackageName)
+status_t AudioRecord::createRecord_l(const Modulo<uint32_t> &epoch)
{
const int64_t beginNs = systemTime();
const sp<IAudioFlinger>& audioFlinger = AudioSystem::get_audio_flinger();
@@ -788,15 +790,13 @@
input.config.sample_rate = mSampleRate;
input.config.channel_mask = mChannelMask;
input.config.format = mFormat;
- input.clientInfo.clientUid = mClientUid;
- input.clientInfo.clientPid = mClientPid;
+ input.clientInfo.identity = mClientIdentity;
input.clientInfo.clientTid = -1;
if (mFlags & AUDIO_INPUT_FLAG_FAST) {
if (mAudioRecordThread != 0) {
input.clientInfo.clientTid = mAudioRecordThread->getTid();
}
}
- input.opPackageName = opPackageName;
input.riid = mTracker->getRiid();
input.flags = mFlags;
@@ -1428,7 +1428,7 @@
// It will also delete the strong references on previous IAudioRecord and IMemory
Modulo<uint32_t> position(mProxy->getPosition());
mNewPosition = position + mUpdatePeriod;
- result = createRecord_l(position, mOpPackageName);
+ result = createRecord_l(position);
if (result == NO_ERROR) {
if (mActive) {
diff --git a/media/libaudioclient/AudioSystem.cpp b/media/libaudioclient/AudioSystem.cpp
index 74258a1..9081ca0 100644
--- a/media/libaudioclient/AudioSystem.cpp
+++ b/media/libaudioclient/AudioSystem.cpp
@@ -52,6 +52,7 @@
using aidl_utils::statusTFromBinderStatus;
using binder::Status;
using media::IAudioPolicyService;
+using media::permission::Identity;
// client singleton for AudioFlinger binder interface
Mutex AudioSystem::gLock;
@@ -940,8 +941,7 @@
audio_io_handle_t* output,
audio_session_t session,
audio_stream_type_t* stream,
- pid_t pid,
- uid_t uid,
+ const Identity& identity,
const audio_config_t* config,
audio_output_flags_t flags,
audio_port_handle_t* selectedDeviceId,
@@ -974,8 +974,6 @@
media::AudioAttributesInternal attrAidl = VALUE_OR_RETURN_STATUS(
legacy2aidl_audio_attributes_t_AudioAttributesInternal(*attr));
int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
- int32_t pidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(pid));
- int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
media::AudioConfig configAidl = VALUE_OR_RETURN_STATUS(
legacy2aidl_audio_config_t_AudioConfig(*config));
int32_t flagsAidl = VALUE_OR_RETURN_STATUS(
@@ -986,7 +984,7 @@
media::GetOutputForAttrResponse responseAidl;
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
- aps->getOutputForAttr(attrAidl, sessionAidl, pidAidl, uidAidl, configAidl, flagsAidl,
+ aps->getOutputForAttr(attrAidl, sessionAidl, identity, configAidl, flagsAidl,
selectedDeviceIdAidl, &responseAidl)));
*output = VALUE_OR_RETURN_STATUS(
@@ -1040,9 +1038,7 @@
audio_io_handle_t* input,
audio_unique_id_t riid,
audio_session_t session,
- pid_t pid,
- uid_t uid,
- const String16& opPackageName,
+ const Identity &identity,
const audio_config_base_t* config,
audio_input_flags_t flags,
audio_port_handle_t* selectedDeviceId,
@@ -1072,10 +1068,6 @@
int32_t inputAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_io_handle_t_int32_t(*input));
int32_t riidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_unique_id_t_int32_t(riid));
int32_t sessionAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_session_t_int32_t(session));
- int32_t pidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(pid));
- int32_t uidAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_uid_t_int32_t(uid));
- std::string opPackageNameAidl = VALUE_OR_RETURN_STATUS(
- legacy2aidl_String16_string(opPackageName));
media::AudioConfigBase configAidl = VALUE_OR_RETURN_STATUS(
legacy2aidl_audio_config_base_t_AudioConfigBase(*config));
int32_t flagsAidl = VALUE_OR_RETURN_STATUS(legacy2aidl_audio_input_flags_t_int32_t_mask(flags));
@@ -1085,9 +1077,8 @@
media::GetInputForAttrResponse response;
RETURN_STATUS_IF_ERROR(statusTFromBinderStatus(
- aps->getInputForAttr(attrAidl, inputAidl, riidAidl, sessionAidl, pidAidl, uidAidl,
- opPackageNameAidl, configAidl, flagsAidl, selectedDeviceIdAidl,
- &response)));
+ aps->getInputForAttr(attrAidl, inputAidl, riidAidl, sessionAidl, identity,
+ configAidl, flagsAidl, selectedDeviceIdAidl, &response)));
*input = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_audio_io_handle_t(response.input));
*selectedDeviceId = VALUE_OR_RETURN_STATUS(
diff --git a/media/libaudioclient/AudioTrack.cpp b/media/libaudioclient/AudioTrack.cpp
index 7d6d453..8788a86 100644
--- a/media/libaudioclient/AudioTrack.cpp
+++ b/media/libaudioclient/AudioTrack.cpp
@@ -48,6 +48,7 @@
// ---------------------------------------------------------------------------
using media::VolumeShaper;
+using media::permission::Identity;
// TODO: Move to a separate .h
@@ -224,11 +225,11 @@
return NO_ERROR;
}
-AudioTrack::AudioTrack() : AudioTrack("" /*opPackageName*/)
+AudioTrack::AudioTrack() : AudioTrack(Identity())
{
}
-AudioTrack::AudioTrack(const std::string& opPackageName)
+AudioTrack::AudioTrack(const Identity& identity)
: mStatus(NO_INIT),
mState(STATE_STOPPED),
mPreviousPriority(ANDROID_PRIORITY_NORMAL),
@@ -236,7 +237,7 @@
mPausedPosition(0),
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE),
- mOpPackageName(opPackageName),
+ mClientIdentity(identity),
mAudioTrackCallback(new AudioTrackCallback())
{
mAttributes.content_type = AUDIO_CONTENT_TYPE_UNKNOWN;
@@ -258,19 +259,16 @@
audio_session_t sessionId,
transfer_type transferType,
const audio_offload_info_t *offloadInfo,
- uid_t uid,
- pid_t pid,
+ const Identity& identity,
const audio_attributes_t* pAttributes,
bool doNotReconnect,
float maxRequiredSpeed,
- audio_port_handle_t selectedDeviceId,
- const std::string& opPackageName)
+ audio_port_handle_t selectedDeviceId)
: mStatus(NO_INIT),
mState(STATE_STOPPED),
mPreviousPriority(ANDROID_PRIORITY_NORMAL),
mPreviousSchedulingGroup(SP_DEFAULT),
mPausedPosition(0),
- mOpPackageName(opPackageName),
mAudioTrackCallback(new AudioTrackCallback())
{
mAttributes = AUDIO_ATTRIBUTES_INITIALIZER;
@@ -278,7 +276,7 @@
(void)set(streamType, sampleRate, format, channelMask,
frameCount, flags, cbf, user, notificationFrames,
0 /*sharedBuffer*/, false /*threadCanCallJava*/, sessionId, transferType,
- offloadInfo, uid, pid, pAttributes, doNotReconnect, maxRequiredSpeed, selectedDeviceId);
+ offloadInfo, identity, pAttributes, doNotReconnect, maxRequiredSpeed, selectedDeviceId);
}
AudioTrack::AudioTrack(
@@ -294,19 +292,16 @@
audio_session_t sessionId,
transfer_type transferType,
const audio_offload_info_t *offloadInfo,
- uid_t uid,
- pid_t pid,
+ const Identity& identity,
const audio_attributes_t* pAttributes,
bool doNotReconnect,
- float maxRequiredSpeed,
- const std::string& opPackageName)
+ float maxRequiredSpeed)
: mStatus(NO_INIT),
mState(STATE_STOPPED),
mPreviousPriority(ANDROID_PRIORITY_NORMAL),
mPreviousSchedulingGroup(SP_DEFAULT),
mPausedPosition(0),
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
- mOpPackageName(opPackageName),
mAudioTrackCallback(new AudioTrackCallback())
{
mAttributes = AUDIO_ATTRIBUTES_INITIALIZER;
@@ -314,7 +309,7 @@
(void)set(streamType, sampleRate, format, channelMask,
0 /*frameCount*/, flags, cbf, user, notificationFrames,
sharedBuffer, false /*threadCanCallJava*/, sessionId, transferType, offloadInfo,
- uid, pid, pAttributes, doNotReconnect, maxRequiredSpeed);
+ identity, pAttributes, doNotReconnect, maxRequiredSpeed);
}
AudioTrack::~AudioTrack()
@@ -352,10 +347,11 @@
mCblkMemory.clear();
mSharedBuffer.clear();
IPCThreadState::self()->flushCommands();
+ pid_t clientPid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mClientIdentity.pid));
ALOGV("%s(%d), releasing session id %d from %d on behalf of %d",
__func__, mPortId,
- mSessionId, IPCThreadState::self()->getCallingPid(), mClientPid);
- AudioSystem::releaseAudioSessionId(mSessionId, mClientPid);
+ mSessionId, IPCThreadState::self()->getCallingPid(), clientPid);
+ AudioSystem::releaseAudioSessionId(mSessionId, clientPid);
}
}
@@ -374,8 +370,7 @@
audio_session_t sessionId,
transfer_type transferType,
const audio_offload_info_t *offloadInfo,
- uid_t uid,
- pid_t pid,
+ const Identity& identity,
const audio_attributes_t* pAttributes,
bool doNotReconnect,
float maxRequiredSpeed,
@@ -385,13 +380,15 @@
uint32_t channelCount;
pid_t callingPid;
pid_t myPid;
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
// Note mPortId is not valid until the track is created, so omit mPortId in ALOG for set.
ALOGV("%s(): streamType %d, sampleRate %u, format %#x, channelMask %#x, frameCount %zu, "
"flags #%x, notificationFrames %d, sessionId %d, transferType %d, uid %d, pid %d",
__func__,
streamType, sampleRate, format, channelMask, frameCount, flags, notificationFrames,
- sessionId, transferType, uid, pid);
+ sessionId, transferType, identity.uid, identity.pid);
mThreadCanCallJava = threadCanCallJava;
mSelectedDeviceId = selectedDeviceId;
@@ -587,17 +584,19 @@
notificationFrames, minNotificationsPerBuffer, maxNotificationsPerBuffer);
}
mNotificationFramesAct = 0;
+ // TODO b/182392553: refactor or remove
callingPid = IPCThreadState::self()->getCallingPid();
myPid = getpid();
- if (uid == AUDIO_UID_INVALID || (callingPid != myPid)) {
- mClientUid = IPCThreadState::self()->getCallingUid();
+ if (uid == -1 || (callingPid != myPid)) {
+ mClientIdentity.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(
+ IPCThreadState::self()->getCallingUid()));
} else {
- mClientUid = uid;
+ mClientIdentity.uid = identity.uid;
}
- if (pid == -1 || (callingPid != myPid)) {
- mClientPid = callingPid;
+ if (pid == (pid_t)-1 || (callingPid != myPid)) {
+ mClientIdentity.pid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(callingPid));
} else {
- mClientPid = pid;
+ mClientIdentity.pid = identity.pid;
}
mAuxEffectId = 0;
mOrigFlags = mFlags = flags;
@@ -636,7 +635,7 @@
mReleased = 0;
mStartNs = 0;
mStartFromZeroUs = 0;
- AudioSystem::acquireAudioSessionId(mSessionId, mClientPid, mClientUid);
+ AudioSystem::acquireAudioSessionId(mSessionId, pid, uid);
mSequence = 1;
mObservedSequence = mSequence;
mInUnderrun = false;
@@ -682,10 +681,13 @@
float maxRequiredSpeed,
audio_port_handle_t selectedDeviceId)
{
+ Identity identity;
+ identity.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(uid));
+ identity.pid = VALUE_OR_FATAL(legacy2aidl_pid_t_int32_t(pid));
return set(streamType, sampleRate, format,
static_cast<audio_channel_mask_t>(channelMask),
frameCount, flags, cbf, user, notificationFrames, sharedBuffer,
- threadCanCallJava, sessionId, transferType, offloadInfo, uid, pid,
+ threadCanCallJava, sessionId, transferType, offloadInfo, identity,
pAttributes, doNotReconnect, maxRequiredSpeed, selectedDeviceId);
}
@@ -1647,8 +1649,7 @@
input.config.channel_mask = mChannelMask;
input.config.format = mFormat;
input.config.offload_info = mOffloadInfoCopy;
- input.clientInfo.clientUid = mClientUid;
- input.clientInfo.clientPid = mClientPid;
+ input.clientInfo.identity = mClientIdentity;
input.clientInfo.clientTid = -1;
if (mFlags & AUDIO_OUTPUT_FLAG_FAST) {
// It is currently meaningless to request SCHED_FIFO for a Java thread. Even if the
@@ -1672,7 +1673,6 @@
input.selectedDeviceId = mSelectedDeviceId;
input.sessionId = mSessionId;
input.audioTrackCallback = mAudioTrackCallback;
- input.opPackageName = mOpPackageName;
media::CreateTrackResponse response;
status = audioFlinger->createTrack(VALUE_OR_FATAL(input.toAidl()), response);
diff --git a/media/libaudioclient/IAudioFlinger.cpp b/media/libaudioclient/IAudioFlinger.cpp
index 20124df..4103630 100644
--- a/media/libaudioclient/IAudioFlinger.cpp
+++ b/media/libaudioclient/IAudioFlinger.cpp
@@ -61,7 +61,6 @@
aidl.notificationsPerBuffer = VALUE_OR_RETURN(convertIntegral<int32_t>(notificationsPerBuffer));
aidl.speed = speed;
aidl.audioTrackCallback = audioTrackCallback;
- aidl.opPackageName = opPackageName;
aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_output_flags_t_int32_t_mask(flags));
aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(frameCount));
aidl.notificationFrameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(notificationFrameCount));
@@ -82,7 +81,6 @@
convertIntegral<uint32_t>(aidl.notificationsPerBuffer));
legacy.speed = aidl.speed;
legacy.audioTrackCallback = aidl.audioTrackCallback;
- legacy.opPackageName = aidl.opPackageName;
legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_output_flags_t_mask(aidl.flags));
legacy.frameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
legacy.notificationFrameCount = VALUE_OR_RETURN(
@@ -139,7 +137,6 @@
aidl.attr = VALUE_OR_RETURN(legacy2aidl_audio_attributes_t_AudioAttributesInternal(attr));
aidl.config = VALUE_OR_RETURN(legacy2aidl_audio_config_base_t_AudioConfigBase(config));
aidl.clientInfo = VALUE_OR_RETURN(legacy2aidl_AudioClient_AudioClient(clientInfo));
- aidl.opPackageName = VALUE_OR_RETURN(legacy2aidl_String16_string(opPackageName));
aidl.riid = VALUE_OR_RETURN(legacy2aidl_audio_unique_id_t_int32_t(riid));
aidl.flags = VALUE_OR_RETURN(legacy2aidl_audio_input_flags_t_int32_t_mask(flags));
aidl.frameCount = VALUE_OR_RETURN(convertIntegral<int64_t>(frameCount));
@@ -157,7 +154,6 @@
legacy.attr = VALUE_OR_RETURN(aidl2legacy_AudioAttributesInternal_audio_attributes_t(aidl.attr));
legacy.config = VALUE_OR_RETURN(aidl2legacy_AudioConfigBase_audio_config_base_t(aidl.config));
legacy.clientInfo = VALUE_OR_RETURN(aidl2legacy_AudioClient_AudioClient(aidl.clientInfo));
- legacy.opPackageName = VALUE_OR_RETURN(aidl2legacy_string_view_String16(aidl.opPackageName));
legacy.riid = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_unique_id_t(aidl.riid));
legacy.flags = VALUE_OR_RETURN(aidl2legacy_int32_t_audio_input_flags_t_mask(aidl.flags));
legacy.frameCount = VALUE_OR_RETURN(convertIntegral<size_t>(aidl.frameCount));
diff --git a/media/libaudioclient/ToneGenerator.cpp b/media/libaudioclient/ToneGenerator.cpp
index c9f3ab9..451c4b1 100644
--- a/media/libaudioclient/ToneGenerator.cpp
+++ b/media/libaudioclient/ToneGenerator.cpp
@@ -27,6 +27,7 @@
namespace android {
+using media::permission::Identity;
// Descriptors for all available tones (See ToneGenerator::ToneDescriptor class declaration for details)
const ToneGenerator::ToneDescriptor ToneGenerator::sToneDescriptors[] = {
@@ -1259,7 +1260,10 @@
////////////////////////////////////////////////////////////////////////////////
bool ToneGenerator::initAudioTrack() {
// Open audio track in mono, PCM 16bit, default sampling rate.
- mpAudioTrack = new AudioTrack(mOpPackageName);
+ // TODO b/182392769: use identity util
+ Identity identity = Identity();
+ identity.packageName = mOpPackageName;
+ mpAudioTrack = new AudioTrack(identity);
ALOGV("AudioTrack(%p) created", mpAudioTrack.get());
audio_attributes_t attr;
@@ -1285,8 +1289,7 @@
AUDIO_SESSION_ALLOCATE,
AudioTrack::TRANSFER_CALLBACK,
nullptr,
- AUDIO_UID_INVALID,
- -1,
+ identity,
&attr);
// Set caller name so it can be logged in destructor.
// MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_TONEGENERATOR
diff --git a/media/libaudioclient/aidl/android/media/AudioClient.aidl b/media/libaudioclient/aidl/android/media/AudioClient.aidl
index 7bff0d6..aa4d8f5 100644
--- a/media/libaudioclient/aidl/android/media/AudioClient.aidl
+++ b/media/libaudioclient/aidl/android/media/AudioClient.aidl
@@ -16,15 +16,13 @@
package android.media;
+import android.media.permission.Identity;
+
/**
* {@hide}
*/
parcelable AudioClient {
- /** Interpreted as uid_t. */
- int clientUid;
- /** Interpreted as pid_t. */
- int clientPid;
/** Interpreted as pid_t. */
int clientTid;
- @utf8InCpp String packageName;
+ Identity identity;
}
diff --git a/media/libaudioclient/aidl/android/media/CreateEffectRequest.aidl b/media/libaudioclient/aidl/android/media/CreateEffectRequest.aidl
index 8368854..5737fcd 100644
--- a/media/libaudioclient/aidl/android/media/CreateEffectRequest.aidl
+++ b/media/libaudioclient/aidl/android/media/CreateEffectRequest.aidl
@@ -19,6 +19,7 @@
import android.media.AudioDevice;
import android.media.EffectDescriptor;
import android.media.IEffectClient;
+import android.media.permission.Identity;
/**
* Input arguments of the createEffect() method.
@@ -34,8 +35,6 @@
/** Interpreted as audio_session_t. */
int sessionId;
AudioDevice device;
- @utf8InCpp String opPackageName;
- /** Interpreted as pid_t. */
- int pid;
+ Identity identity;
boolean probe;
}
diff --git a/media/libaudioclient/aidl/android/media/CreateRecordRequest.aidl b/media/libaudioclient/aidl/android/media/CreateRecordRequest.aidl
index 6da743a..62007da 100644
--- a/media/libaudioclient/aidl/android/media/CreateRecordRequest.aidl
+++ b/media/libaudioclient/aidl/android/media/CreateRecordRequest.aidl
@@ -19,6 +19,7 @@
import android.media.AudioAttributesInternal;
import android.media.AudioClient;
import android.media.AudioConfigBase;
+import android.media.permission.Identity;
/**
* CreateRecordRequest contains all input arguments sent by AudioRecord to AudioFlinger
@@ -31,7 +32,6 @@
AudioAttributesInternal attr;
AudioConfigBase config;
AudioClient clientInfo;
- @utf8InCpp String opPackageName;
/** Interpreted as audio_unique_id_t. */
int riid;
/** Bitmask, indexed by AudioInputFlags. */
diff --git a/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl b/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
index 89fad5a..a125434 100644
--- a/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
+++ b/media/libaudioclient/aidl/android/media/IAudioPolicyService.aidl
@@ -48,6 +48,7 @@
import android.media.IAudioPolicyServiceClient;
import android.media.ICaptureStateListener;
import android.media.Int;
+import android.media.permission.Identity;
import android.media.SoundTriggerSession;
/**
@@ -80,8 +81,7 @@
GetOutputForAttrResponse getOutputForAttr(in AudioAttributesInternal attr,
int /* audio_session_t */ session,
- int /* pid_t */ pid,
- int /* uid_t */ uid,
+ in Identity identity,
in AudioConfig config,
int /* Bitmask, indexed by AudioOutputFlags */ flags,
int /* audio_port_handle_t */ selectedDeviceId);
@@ -96,9 +96,7 @@
int /* audio_io_handle_t */ input,
int /* audio_unique_id_t */ riid,
int /* audio_session_t */ session,
- int /* pid_t */ pid,
- int /* uid_t */ uid,
- @utf8InCpp String opPackageName,
+ in Identity identity,
in AudioConfigBase config,
int /* Bitmask, indexed by AudioInputFlags */ flags,
int /* audio_port_handle_t */ selectedDeviceId);
diff --git a/media/libaudioclient/fuzzer/Android.bp b/media/libaudioclient/fuzzer/Android.bp
index 18a3704..21e25b9 100644
--- a/media/libaudioclient/fuzzer/Android.bp
+++ b/media/libaudioclient/fuzzer/Android.bp
@@ -65,6 +65,7 @@
"libutils",
"libxml2",
"mediametricsservice-aidl-cpp",
+ "media_permission-aidl-cpp",
],
header_libs: [
"libaudiofoundation_headers",
diff --git a/media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp b/media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp
index 84309ee..1b75917 100644
--- a/media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp
+++ b/media/libaudioclient/fuzzer/audioflinger_fuzzer.cpp
@@ -23,8 +23,10 @@
*/
#include <android_audio_policy_configuration_V7_0-enums.h>
+#include <android/media/permission/Identity.h>
#include <binder/IServiceManager.h>
#include <binder/MemoryDealer.h>
+#include <media/AidlConversion.h>
#include <media/AudioEffect.h>
#include <media/AudioRecord.h>
#include <media/AudioSystem.h>
@@ -46,6 +48,8 @@
using namespace ::android::audio::policy::configuration::V7_0;
}
+using media::permission::Identity;
+
constexpr audio_unique_id_use_t kUniqueIds[] = {
AUDIO_UNIQUE_ID_USE_UNSPECIFIED, AUDIO_UNIQUE_ID_USE_SESSION, AUDIO_UNIQUE_ID_USE_MODULE,
AUDIO_UNIQUE_ID_USE_EFFECT, AUDIO_UNIQUE_ID_USE_PATCH, AUDIO_UNIQUE_ID_USE_OUTPUT,
@@ -221,11 +225,15 @@
attributes.usage = usage;
sp<AudioTrack> track = new AudioTrack();
+ // TODO b/182392769: use identity util
+ Identity i;
+ i.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(getuid()));
+ i.pid = VALUE_OR_FATAL(legacy2aidl_pid_t_int32_t(getpid()));
track->set(AUDIO_STREAM_DEFAULT, sampleRate, format, channelMask, frameCount, flags, nullptr,
nullptr, notificationFrames, sharedBuffer, false, sessionId,
((fast && sharedBuffer == 0) || offload) ? AudioTrack::TRANSFER_CALLBACK
: AudioTrack::TRANSFER_DEFAULT,
- offload ? &offloadInfo : nullptr, getuid(), getpid(), &attributes, false, 1.0f,
+ offload ? &offloadInfo : nullptr, i, &attributes, false, 1.0f,
AUDIO_PORT_HANDLE_NONE);
status_t status = track->initCheck();
@@ -300,7 +308,10 @@
attributes.source = inputSource;
- sp<AudioRecord> record = new AudioRecord(String16(mFdp.ConsumeRandomLengthString().c_str()));
+ // TODO b/182392769: use identity util
+ Identity i;
+ i.packageName = std::string(mFdp.ConsumeRandomLengthString().c_str());
+ sp<AudioRecord> record = new AudioRecord(i);
record->set(AUDIO_SOURCE_DEFAULT, sampleRate, format, channelMask, frameCount, nullptr, nullptr,
notificationFrames, false, sessionId,
fast ? AudioRecord::TRANSFER_CALLBACK : AudioRecord::TRANSFER_DEFAULT, flags,
@@ -391,7 +402,7 @@
const int32_t priority = mFdp.ConsumeIntegral<int32_t>();
audio_session_t sessionId = static_cast<audio_session_t>(mFdp.ConsumeIntegral<int32_t>());
const audio_io_handle_t io = mFdp.ConsumeIntegral<int32_t>();
- String16 opPackageName = static_cast<String16>(mFdp.ConsumeRandomLengthString().c_str());
+ std::string opPackageName = static_cast<std::string>(mFdp.ConsumeRandomLengthString().c_str());
AudioDeviceTypeAddr device;
sp<IAudioFlinger> af = AudioSystem::get_audio_flinger();
@@ -407,8 +418,9 @@
request.output = io;
request.sessionId = sessionId;
request.device = VALUE_OR_RETURN_STATUS(legacy2aidl_AudioDeviceTypeAddress(device));
- request.opPackageName = VALUE_OR_RETURN_STATUS(legacy2aidl_String16_string(opPackageName));
- request.pid = getpid();
+ // TODO b/182392769: use identity util
+ request.identity.packageName = opPackageName;
+ request.identity.pid = VALUE_OR_RETURN_STATUS(legacy2aidl_pid_t_int32_t(getpid()));
request.probe = false;
media::CreateEffectResponse response{};
diff --git a/media/libaudioclient/include/media/AidlConversion.h b/media/libaudioclient/include/media/AidlConversion.h
index bde20cd..fd87dc2 100644
--- a/media/libaudioclient/include/media/AidlConversion.h
+++ b/media/libaudioclient/include/media/AidlConversion.h
@@ -108,6 +108,11 @@
ConversionResult<String16> aidl2legacy_string_view_String16(std::string_view aidl);
ConversionResult<std::string> legacy2aidl_String16_string(const String16& legacy);
+ConversionResult<std::optional<String16>>
+aidl2legacy_optional_string_view_optional_String16(std::optional<std::string_view> aidl);
+ConversionResult<std::optional<std::string_view>>
+legacy2aidl_optional_String16_optional_string(std::optional<String16> legacy);
+
ConversionResult<audio_io_config_event> aidl2legacy_AudioIoConfigEvent_audio_io_config_event(
media::AudioIoConfigEvent aidl);
ConversionResult<media::AudioIoConfigEvent> legacy2aidl_audio_io_config_event_AudioIoConfigEvent(
diff --git a/media/libaudioclient/include/media/AudioClient.h b/media/libaudioclient/include/media/AudioClient.h
index 0b89d15..295fd4f 100644
--- a/media/libaudioclient/include/media/AudioClient.h
+++ b/media/libaudioclient/include/media/AudioClient.h
@@ -19,19 +19,17 @@
#define ANDROID_AUDIO_CLIENT_H
#include <sys/types.h>
-#include <utils/String16.h>
+#include <android/media/permission/Identity.h>
namespace android {
class AudioClient {
public:
AudioClient() :
- clientUid(-1), clientPid(-1), clientTid(-1), packageName("") {}
+ clientTid(-1) {}
- uid_t clientUid;
- pid_t clientPid;
pid_t clientTid;
- String16 packageName;
+ android::media::permission::Identity identity;
};
}; // namespace android
diff --git a/media/libaudioclient/include/media/AudioEffect.h b/media/libaudioclient/include/media/AudioEffect.h
index 0d18fb1..974ce62 100644
--- a/media/libaudioclient/include/media/AudioEffect.h
+++ b/media/libaudioclient/include/media/AudioEffect.h
@@ -23,6 +23,7 @@
#include <media/IAudioFlinger.h>
#include <media/AudioSystem.h>
#include <system/audio_effect.h>
+#include <android/media/permission/Identity.h>
#include <utils/RefBase.h>
#include <utils/Errors.h>
@@ -31,7 +32,6 @@
#include "android/media/IEffect.h"
#include "android/media/BnEffectClient.h"
-
namespace android {
// ----------------------------------------------------------------------------
@@ -337,9 +337,9 @@
*
* Parameters:
*
- * opPackageName: The package name used for app op checks.
+ * client: Identity for app-op checks
*/
- explicit AudioEffect(const String16& opPackageName);
+ explicit AudioEffect(const media::permission::Identity& client);
/* Terminates the AudioEffect and unregisters it from AudioFlinger.
* The effect engine is also destroyed if this AudioEffect was the last controlling
@@ -531,7 +531,7 @@
static const uint32_t kMaxPreProcessing = 10;
protected:
- const String16 mOpPackageName; // The package name used for app op checks.
+ media::permission::Identity mClientIdentity; // Identity used for app op checks.
bool mEnabled = false; // enable state
audio_session_t mSessionId = AUDIO_SESSION_OUTPUT_MIX; // audio session ID
int32_t mPriority = 0; // priority for effect control
@@ -606,8 +606,6 @@
sp<EffectClient> mIEffectClient; // IEffectClient implementation
sp<IMemory> mCblkMemory; // shared memory for deferred parameter setting
effect_param_cblk_t* mCblk = nullptr; // control block for deferred parameter setting
- pid_t mClientPid = (pid_t)-1;
- uid_t mClientUid = (uid_t)-1;
};
diff --git a/media/libaudioclient/include/media/AudioRecord.h b/media/libaudioclient/include/media/AudioRecord.h
index d70d91e..82a29d4 100644
--- a/media/libaudioclient/include/media/AudioRecord.h
+++ b/media/libaudioclient/include/media/AudioRecord.h
@@ -32,6 +32,7 @@
#include <utils/threads.h>
#include "android/media/IAudioRecord.h"
+#include <android/media/permission/Identity.h>
namespace android {
@@ -148,9 +149,9 @@
*
* Parameters:
*
- * opPackageName: The package name used for app ops.
+ * clientIdentity: The identity of the owner of the record
*/
- AudioRecord(const String16& opPackageName);
+ AudioRecord(const media::permission::Identity& clientIdentity);
/* Creates an AudioRecord object and registers it with AudioFlinger.
* Once created, the track needs to be started before it can be used.
@@ -163,7 +164,7 @@
* format: Audio format (e.g AUDIO_FORMAT_PCM_16_BIT for signed
* 16 bits per sample).
* channelMask: Channel mask, such that audio_is_input_channel(channelMask) is true.
- * opPackageName: The package name used for app ops.
+ * client: The identity of the owner of the record
* frameCount: Minimum size of track PCM buffer in frames. This defines the
* application's contribution to the
* latency of the track. The actual size selected by the AudioRecord could
@@ -186,7 +187,7 @@
uint32_t sampleRate,
audio_format_t format,
audio_channel_mask_t channelMask,
- const String16& opPackageName,
+ const media::permission::Identity& clientIdentity,
size_t frameCount = 0,
callback_t cbf = NULL,
void* user = NULL,
@@ -194,8 +195,6 @@
audio_session_t sessionId = AUDIO_SESSION_ALLOCATE,
transfer_type transferType = TRANSFER_DEFAULT,
audio_input_flags_t flags = AUDIO_INPUT_FLAG_NONE,
- uid_t uid = AUDIO_UID_INVALID,
- pid_t pid = -1,
const audio_attributes_t* pAttributes = NULL,
audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
audio_microphone_direction_t
@@ -638,7 +637,7 @@
// caller must hold lock on mLock for all _l methods
- status_t createRecord_l(const Modulo<uint32_t> &epoch, const String16& opPackageName);
+ status_t createRecord_l(const Modulo<uint32_t> &epoch);
// FIXME enum is faster than strcmp() for parameter 'from'
status_t restoreRecord_l(const char *from);
@@ -679,7 +678,7 @@
status_t mStatus;
- String16 mOpPackageName; // The package name used for app ops.
+ media::permission::Identity mClientIdentity; // The identity of the owner of this record
size_t mFrameCount; // corresponds to current IAudioRecord, value is
// reported back by AudioFlinger to the client
@@ -754,8 +753,6 @@
sp<DeathNotifier> mDeathNotifier;
uint32_t mSequence; // incremented for each new IAudioRecord attempt
- uid_t mClientUid;
- pid_t mClientPid;
audio_attributes_t mAttributes;
// For Device Selection API
diff --git a/media/libaudioclient/include/media/AudioSystem.h b/media/libaudioclient/include/media/AudioSystem.h
index 694f2d0..d350b32 100644
--- a/media/libaudioclient/include/media/AudioSystem.h
+++ b/media/libaudioclient/include/media/AudioSystem.h
@@ -19,6 +19,7 @@
#include <sys/types.h>
+#include <android/media/permission/Identity.h>
#include <android/media/BnAudioFlingerClient.h>
#include <android/media/BnAudioPolicyServiceClient.h>
#include <media/AidlConversionUtil.h>
@@ -262,8 +263,7 @@
audio_io_handle_t *output,
audio_session_t session,
audio_stream_type_t *stream,
- pid_t pid,
- uid_t uid,
+ const media::permission::Identity& identity,
const audio_config_t *config,
audio_output_flags_t flags,
audio_port_handle_t *selectedDeviceId,
@@ -279,9 +279,7 @@
audio_io_handle_t *input,
audio_unique_id_t riid,
audio_session_t session,
- pid_t pid,
- uid_t uid,
- const String16& opPackageName,
+ const media::permission::Identity& identity,
const audio_config_base_t *config,
audio_input_flags_t flags,
audio_port_handle_t *selectedDeviceId,
diff --git a/media/libaudioclient/include/media/AudioTrack.h b/media/libaudioclient/include/media/AudioTrack.h
index 2609ec1..b1650ed 100644
--- a/media/libaudioclient/include/media/AudioTrack.h
+++ b/media/libaudioclient/include/media/AudioTrack.h
@@ -26,6 +26,7 @@
#include <media/Modulo.h>
#include <media/VolumeShaper.h>
#include <utils/threads.h>
+#include <android/media/permission/Identity.h>
#include <string>
@@ -181,7 +182,7 @@
*/
AudioTrack();
- AudioTrack(const std::string& opPackageName);
+ AudioTrack(const media::permission::Identity& identity);
/* Creates an AudioTrack object and registers it with AudioFlinger.
* Once created, the track needs to be started before it can be used.
@@ -229,10 +230,9 @@
* transferType: How data is transferred to AudioTrack.
* offloadInfo: If not NULL, provides offload parameters for
* AudioSystem::getOutputForAttr().
- * uid: User ID of the app which initially requested this AudioTrack
- * for power management tracking, or -1 for current user ID.
- * pid: Process ID of the app which initially requested this AudioTrack
- * for power management tracking, or -1 for current process ID.
+ * identity: The identity of the app which initiallly requested this AudioTrack.
+ * Includes the UID and PID for power management tracking, or -1 for
+ * current user/process ID, plus the package name.
* pAttributes: If not NULL, supersedes streamType for use case selection.
* doNotReconnect: If set to true, AudioTrack won't automatically recreate the IAudioTrack
binder to AudioFlinger.
@@ -259,13 +259,12 @@
audio_session_t sessionId = AUDIO_SESSION_ALLOCATE,
transfer_type transferType = TRANSFER_DEFAULT,
const audio_offload_info_t *offloadInfo = NULL,
- uid_t uid = AUDIO_UID_INVALID,
- pid_t pid = -1,
+ const media::permission::Identity& identity =
+ media::permission::Identity(),
const audio_attributes_t* pAttributes = NULL,
bool doNotReconnect = false,
float maxRequiredSpeed = 1.0f,
- audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
- const std::string& opPackageName = "");
+ audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE);
/* Creates an audio track and registers it with AudioFlinger.
* With this constructor, the track is configured for static buffer mode.
@@ -291,12 +290,11 @@
audio_session_t sessionId = AUDIO_SESSION_ALLOCATE,
transfer_type transferType = TRANSFER_DEFAULT,
const audio_offload_info_t *offloadInfo = NULL,
- uid_t uid = AUDIO_UID_INVALID,
- pid_t pid = -1,
+ const media::permission::Identity& identity =
+ media::permission::Identity(),
const audio_attributes_t* pAttributes = NULL,
bool doNotReconnect = false,
- float maxRequiredSpeed = 1.0f,
- const std::string& opPackageName = "");
+ float maxRequiredSpeed = 1.0f);
/* Terminates the AudioTrack and unregisters it from AudioFlinger.
* Also destroys all resources associated with the AudioTrack.
@@ -340,8 +338,8 @@
audio_session_t sessionId = AUDIO_SESSION_ALLOCATE,
transfer_type transferType = TRANSFER_DEFAULT,
const audio_offload_info_t *offloadInfo = NULL,
- uid_t uid = AUDIO_UID_INVALID,
- pid_t pid = -1,
+ const media::permission::Identity& identity =
+ media::permission::Identity(),
const audio_attributes_t* pAttributes = NULL,
bool doNotReconnect = false,
float maxRequiredSpeed = 1.0f,
@@ -1311,8 +1309,6 @@
sp<media::VolumeHandler> mVolumeHandler;
- const std::string mOpPackageName;
-
private:
class DeathNotifier : public IBinder::DeathRecipient {
public:
@@ -1325,8 +1321,7 @@
sp<DeathNotifier> mDeathNotifier;
uint32_t mSequence; // incremented for each new IAudioTrack attempt
- uid_t mClientUid;
- pid_t mClientPid;
+ media::permission::Identity mClientIdentity;
wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;
diff --git a/media/libaudioclient/include/media/IAudioFlinger.h b/media/libaudioclient/include/media/IAudioFlinger.h
index 9a8014d..efd7fed 100644
--- a/media/libaudioclient/include/media/IAudioFlinger.h
+++ b/media/libaudioclient/include/media/IAudioFlinger.h
@@ -37,6 +37,7 @@
#include <android/media/BnAudioFlingerService.h>
#include <android/media/BpAudioFlingerService.h>
+#include <android/media/permission/Identity.h>
#include "android/media/CreateEffectRequest.h"
#include "android/media/CreateEffectResponse.h"
#include "android/media/CreateRecordRequest.h"
@@ -78,7 +79,6 @@
uint32_t notificationsPerBuffer;
float speed;
sp<media::IAudioTrackCallback> audioTrackCallback;
- std::string opPackageName;
/* input/output */
audio_output_flags_t flags;
@@ -127,7 +127,7 @@
audio_attributes_t attr;
audio_config_base_t config;
AudioClient clientInfo;
- String16 opPackageName;
+ media::permission::Identity identity;
audio_unique_id_t riid;
/* input/output */
diff --git a/media/libaudioclient/tests/test_create_audiorecord.cpp b/media/libaudioclient/tests/test_create_audiorecord.cpp
index cf6a734..57676c1 100644
--- a/media/libaudioclient/tests/test_create_audiorecord.cpp
+++ b/media/libaudioclient/tests/test_create_audiorecord.cpp
@@ -19,6 +19,7 @@
#include <string.h>
#include <unistd.h>
+#include <android/media/permission/Identity.h>
#include <binder/MemoryBase.h>
#include <binder/MemoryDealer.h>
#include <binder/MemoryHeapBase.h>
@@ -32,19 +33,24 @@
namespace android {
+using media::permission::Identity;
+
int testRecord(FILE *inputFile, int outputFileFd)
{
char line[MAX_INPUT_FILE_LINE_LENGTH];
uint32_t testCount = 0;
Vector<String16> args;
int ret = 0;
+ // TODO b/182392769: use identity util
+ Identity identity;
+ identity.packageName = PACKAGE_NAME;
if (inputFile == nullptr) {
sp<AudioRecord> record = new AudioRecord(AUDIO_SOURCE_DEFAULT,
0 /* sampleRate */,
AUDIO_FORMAT_DEFAULT,
AUDIO_CHANNEL_IN_MONO,
- String16(PACKAGE_NAME));
+ identity);
if (record == 0 || record->initCheck() != NO_ERROR) {
write(outputFileFd, "Error creating AudioRecord\n",
sizeof("Error creating AudioRecord\n"));
@@ -90,7 +96,7 @@
memset(&attributes, 0, sizeof(attributes));
attributes.source = inputSource;
- sp<AudioRecord> record = new AudioRecord(String16(PACKAGE_NAME));
+ sp<AudioRecord> record = new AudioRecord(identity);
record->set(AUDIO_SOURCE_DEFAULT,
sampleRate,
diff --git a/media/libmedia/Android.bp b/media/libmedia/Android.bp
index 0223cfd..9e33610 100644
--- a/media/libmedia/Android.bp
+++ b/media/libmedia/Android.bp
@@ -359,6 +359,7 @@
"libaudioclient",
"libmedia_codeclist",
"libmedia_omx",
+ "media_permission-aidl-cpp",
],
export_shared_lib_headers: [
@@ -367,14 +368,17 @@
"libandroidicu",
//"libsonivox",
"libmedia_omx",
+ "media_permission-aidl-cpp",
],
static_libs: [
"resourcemanager_aidl_interface-ndk_platform",
+ "media_permission-aidl-cpp",
],
export_static_lib_headers: [
"resourcemanager_aidl_interface-ndk_platform",
+ "media_permission-aidl-cpp",
],
export_include_dirs: [
diff --git a/media/libmedia/IMediaPlayerService.cpp b/media/libmedia/IMediaPlayerService.cpp
index 11005c6..0f189ee 100644
--- a/media/libmedia/IMediaPlayerService.cpp
+++ b/media/libmedia/IMediaPlayerService.cpp
@@ -35,6 +35,8 @@
namespace android {
+using media::permission::Identity;
+
enum {
CREATE = IBinder::FIRST_CALL_TRANSACTION,
CREATE_MEDIA_RECORDER,
@@ -63,22 +65,22 @@
virtual sp<IMediaPlayer> create(
const sp<IMediaPlayerClient>& client, audio_session_t audioSessionId,
- const std::string opPackageName) {
+ const Identity& identity) {
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
data.writeStrongBinder(IInterface::asBinder(client));
data.writeInt32(audioSessionId);
- data.writeCString(opPackageName.c_str());
+ data.writeParcelable(identity);
remote()->transact(CREATE, data, &reply);
return interface_cast<IMediaPlayer>(reply.readStrongBinder());
}
- virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName)
+ virtual sp<IMediaRecorder> createMediaRecorder(const Identity& identity)
{
Parcel data, reply;
data.writeInterfaceToken(IMediaPlayerService::getInterfaceDescriptor());
- data.writeString16(opPackageName);
+ data.writeParcelable(identity);
remote()->transact(CREATE_MEDIA_RECORDER, data, &reply);
return interface_cast<IMediaRecorder>(reply.readStrongBinder());
}
@@ -129,19 +131,23 @@
sp<IMediaPlayerClient> client =
interface_cast<IMediaPlayerClient>(data.readStrongBinder());
audio_session_t audioSessionId = (audio_session_t) data.readInt32();
- const char* opPackageName = data.readCString();
- if (opPackageName == nullptr) {
- return FAILED_TRANSACTION;
+ Identity identity;
+ status_t status = data.readParcelable(&identity);
+ if (status != NO_ERROR) {
+ return status;
}
- std::string opPackageNameStr(opPackageName);
- sp<IMediaPlayer> player = create(client, audioSessionId, opPackageNameStr);
+ sp<IMediaPlayer> player = create(client, audioSessionId, identity);
reply->writeStrongBinder(IInterface::asBinder(player));
return NO_ERROR;
} break;
case CREATE_MEDIA_RECORDER: {
CHECK_INTERFACE(IMediaPlayerService, data, reply);
- const String16 opPackageName = data.readString16();
- sp<IMediaRecorder> recorder = createMediaRecorder(opPackageName);
+ Identity identity;
+ status_t status = data.readParcelable(&identity);
+ if (status != NO_ERROR) {
+ return status;
+ }
+ sp<IMediaRecorder> recorder = createMediaRecorder(identity);
reply->writeStrongBinder(IInterface::asBinder(recorder));
return NO_ERROR;
} break;
diff --git a/media/libmedia/include/media/IMediaPlayerService.h b/media/libmedia/include/media/IMediaPlayerService.h
index a4207eb..243e9c7 100644
--- a/media/libmedia/include/media/IMediaPlayerService.h
+++ b/media/libmedia/include/media/IMediaPlayerService.h
@@ -27,6 +27,7 @@
#include <media/IMediaPlayerClient.h>
#include <media/IMediaMetadataRetriever.h>
+#include <android/media/permission/Identity.h>
#include <string>
@@ -46,11 +47,13 @@
public:
DECLARE_META_INTERFACE(MediaPlayerService);
- virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName) = 0;
+ virtual sp<IMediaRecorder> createMediaRecorder(
+ const android::media::permission::Identity &identity) = 0;
virtual sp<IMediaMetadataRetriever> createMetadataRetriever() = 0;
virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client,
audio_session_t audioSessionId = AUDIO_SESSION_ALLOCATE,
- const std::string opPackage = "") = 0;
+ const android::media::permission::Identity& identity =
+ android::media::permission::Identity()) = 0;
virtual sp<IMediaCodecList> getCodecList() const = 0;
// Connects to a remote display.
diff --git a/media/libmedia/include/media/MediaRecorderBase.h b/media/libmedia/include/media/MediaRecorderBase.h
index d9a7efb..b5325ce 100644
--- a/media/libmedia/include/media/MediaRecorderBase.h
+++ b/media/libmedia/include/media/MediaRecorderBase.h
@@ -21,6 +21,7 @@
#include <media/AudioSystem.h>
#include <media/MicrophoneInfo.h>
#include <media/mediarecorder.h>
+#include <android/media/permission/Identity.h>
#include <system/audio.h>
@@ -33,8 +34,8 @@
struct PersistentSurface;
struct MediaRecorderBase {
- MediaRecorderBase(const String16 &opPackageName)
- : mOpPackageName(opPackageName) {}
+ explicit MediaRecorderBase(const media::permission::Identity &client)
+ : mClient(client) {}
virtual ~MediaRecorderBase() {}
virtual status_t init() = 0;
@@ -83,7 +84,7 @@
protected:
- String16 mOpPackageName;
+ media::permission::Identity mClient;
private:
MediaRecorderBase(const MediaRecorderBase &);
diff --git a/media/libmedia/include/media/mediaplayer.h b/media/libmedia/include/media/mediaplayer.h
index 71c0bc5..fbba398 100644
--- a/media/libmedia/include/media/mediaplayer.h
+++ b/media/libmedia/include/media/mediaplayer.h
@@ -29,6 +29,7 @@
#include <media/IMediaPlayer.h>
#include <media/IMediaDeathNotifier.h>
#include <media/IStreamSource.h>
+#include <android/media/permission/Identity.h>
#include <utils/KeyedVector.h>
#include <utils/String8.h>
@@ -211,7 +212,8 @@
public virtual IMediaDeathNotifier
{
public:
- MediaPlayer(const std::string opPackageName = "");
+ explicit MediaPlayer(const android::media::permission::Identity& mIdentity =
+ android::media::permission::Identity());
~MediaPlayer();
void died();
void disconnect();
@@ -315,7 +317,7 @@
float mSendLevel;
struct sockaddr_in mRetransmitEndpoint;
bool mRetransmitEndpointValid;
- const std::string mOpPackageName;
+ const android::media::permission::Identity mIdentity;
};
}; // namespace android
diff --git a/media/libmedia/include/media/mediarecorder.h b/media/libmedia/include/media/mediarecorder.h
index 84c92f6..96a3293 100644
--- a/media/libmedia/include/media/mediarecorder.h
+++ b/media/libmedia/include/media/mediarecorder.h
@@ -25,6 +25,7 @@
#include <media/IMediaRecorderClient.h>
#include <media/IMediaDeathNotifier.h>
#include <media/MicrophoneInfo.h>
+#include <android/media/permission/Identity.h>
namespace android {
@@ -226,7 +227,7 @@
public virtual IMediaDeathNotifier
{
public:
- MediaRecorder(const String16& opPackageName);
+ explicit MediaRecorder(const media::permission::Identity& identity);
~MediaRecorder();
void died();
diff --git a/media/libmedia/mediaplayer.cpp b/media/libmedia/mediaplayer.cpp
index 30c5006..7504787 100644
--- a/media/libmedia/mediaplayer.cpp
+++ b/media/libmedia/mediaplayer.cpp
@@ -40,8 +40,9 @@
namespace android {
using media::VolumeShaper;
+using media::permission::Identity;
-MediaPlayer::MediaPlayer(const std::string opPackageName) : mOpPackageName(opPackageName)
+MediaPlayer::MediaPlayer(const Identity& identity) : mIdentity(identity)
{
ALOGV("constructor");
mListener = NULL;
@@ -152,7 +153,7 @@
if (url != NULL) {
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != 0) {
- sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mOpPackageName));
+ sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mIdentity));
if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
(NO_ERROR != player->setDataSource(httpService, url, headers))) {
player.clear();
@@ -169,7 +170,7 @@
status_t err = UNKNOWN_ERROR;
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != 0) {
- sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mOpPackageName));
+ sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mIdentity));
if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
(NO_ERROR != player->setDataSource(fd, offset, length))) {
player.clear();
@@ -185,7 +186,7 @@
status_t err = UNKNOWN_ERROR;
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != 0) {
- sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mOpPackageName));
+ sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mIdentity));
if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
(NO_ERROR != player->setDataSource(source))) {
player.clear();
@@ -201,7 +202,7 @@
status_t err = UNKNOWN_ERROR;
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != 0) {
- sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mOpPackageName));
+ sp<IMediaPlayer> player(service->create(this, mAudioSessionId, mIdentity));
if ((NO_ERROR != doSetRetransmitEndpoint(player)) ||
(NO_ERROR != player->setDataSource(rtpParams))) {
player.clear();
diff --git a/media/libmedia/mediarecorder.cpp b/media/libmedia/mediarecorder.cpp
index e3cd9d8..da2b190 100644
--- a/media/libmedia/mediarecorder.cpp
+++ b/media/libmedia/mediarecorder.cpp
@@ -33,6 +33,8 @@
namespace android {
+using media::permission::Identity;
+
status_t MediaRecorder::setCamera(const sp<hardware::ICamera>& camera,
const sp<ICameraRecordingProxy>& proxy)
{
@@ -758,13 +760,13 @@
return INVALID_OPERATION;
}
-MediaRecorder::MediaRecorder(const String16& opPackageName) : mSurfaceMediaSource(NULL)
+MediaRecorder::MediaRecorder(const Identity &identity) : mSurfaceMediaSource(NULL)
{
ALOGV("constructor");
const sp<IMediaPlayerService> service(getMediaPlayerService());
if (service != NULL) {
- mMediaRecorder = service->createMediaRecorder(opPackageName);
+ mMediaRecorder = service->createMediaRecorder(identity);
}
if (mMediaRecorder != NULL) {
mCurrentState = MEDIA_RECORDER_IDLE;
diff --git a/media/libmedia/tests/mediaplayer/Android.bp b/media/libmedia/tests/mediaplayer/Android.bp
index 0fff7b4..50f35ea 100644
--- a/media/libmedia/tests/mediaplayer/Android.bp
+++ b/media/libmedia/tests/mediaplayer/Android.bp
@@ -39,6 +39,7 @@
"libstagefright",
"libstagefright_foundation",
"libutils",
+ "media_permission-aidl-cpp",
],
compile_multilib: "first",
cflags: [
diff --git a/media/libmediaplayerservice/Android.bp b/media/libmediaplayerservice/Android.bp
index 56c8368..d250976 100644
--- a/media/libmediaplayerservice/Android.bp
+++ b/media/libmediaplayerservice/Android.bp
@@ -35,6 +35,8 @@
"android.hardware.media.c2@1.0",
"android.hardware.media.omx@1.0",
"av-types-aidl-cpp",
+ "media_permission-aidl-cpp",
+ "libaudioclient_aidl_conversion",
"libbase",
"libandroid_net",
"libaudioclient",
@@ -73,9 +75,13 @@
"libstagefright_nuplayer",
"libstagefright_rtsp",
"libstagefright_timedtext",
+ "media_permission-aidl-cpp",
],
- export_shared_lib_headers: ["libmedia"],
+ export_shared_lib_headers: [
+ "libmedia",
+ "media_permission-aidl-cpp",
+ ],
include_dirs: [
"frameworks/av/media/libstagefright/rtsp",
diff --git a/media/libmediaplayerservice/MediaPlayerService.cpp b/media/libmediaplayerservice/MediaPlayerService.cpp
index 1d5ccca..b85e139 100644
--- a/media/libmediaplayerservice/MediaPlayerService.cpp
+++ b/media/libmediaplayerservice/MediaPlayerService.cpp
@@ -49,6 +49,7 @@
#include <codec2/hidl/client.h>
#include <datasource/HTTPBase.h>
+#include <media/AidlConversion.h>
#include <media/IMediaHTTPService.h>
#include <media/IRemoteDisplay.h>
#include <media/IRemoteDisplayClient.h>
@@ -94,6 +95,7 @@
using android::NOT_ENOUGH_DATA;
using android::Parcel;
using android::media::VolumeShaper;
+using android::media::permission::Identity;
// Max number of entries in the filter.
const int kMaxFilterSize = 64; // I pulled that out of thin air.
@@ -453,14 +455,21 @@
ALOGV("MediaPlayerService destroyed");
}
-sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(const String16 &opPackageName)
+sp<IMediaRecorder> MediaPlayerService::createMediaRecorder(const Identity& identity)
{
- pid_t pid = IPCThreadState::self()->getCallingPid();
- sp<MediaRecorderClient> recorder = new MediaRecorderClient(this, pid, opPackageName);
+ // TODO b/182392769: use identity util
+ Identity verifiedIdentity = identity;
+ verifiedIdentity.uid = VALUE_OR_FATAL(
+ legacy2aidl_uid_t_int32_t(IPCThreadState::self()->getCallingUid()));
+ verifiedIdentity.pid = VALUE_OR_FATAL(
+ legacy2aidl_pid_t_int32_t(IPCThreadState::self()->getCallingPid()));
+ sp<MediaRecorderClient> recorder =
+ new MediaRecorderClient(this, verifiedIdentity);
wp<MediaRecorderClient> w = recorder;
Mutex::Autolock lock(mLock);
mMediaRecorderClients.add(w);
- ALOGV("Create new media recorder client from pid %d", pid);
+ ALOGV("Create new media recorder client from pid %s",
+ verifiedIdentity.toString().c_str());
return recorder;
}
@@ -480,17 +489,21 @@
}
sp<IMediaPlayer> MediaPlayerService::create(const sp<IMediaPlayerClient>& client,
- audio_session_t audioSessionId, std::string opPackageName)
+ audio_session_t audioSessionId, const Identity& identity)
{
- pid_t pid = IPCThreadState::self()->getCallingPid();
int32_t connId = android_atomic_inc(&mNextConnId);
+ // TODO b/182392769: use identity util
+ Identity verifiedIdentity = identity;
+ verifiedIdentity.pid = VALUE_OR_FATAL(
+ legacy2aidl_pid_t_int32_t(IPCThreadState::self()->getCallingPid()));
+ verifiedIdentity.uid = VALUE_OR_FATAL(
+ legacy2aidl_uid_t_int32_t(IPCThreadState::self()->getCallingUid()));
sp<Client> c = new Client(
- this, pid, connId, client, audioSessionId,
- IPCThreadState::self()->getCallingUid(), opPackageName);
+ this, verifiedIdentity, connId, client, audioSessionId);
- ALOGV("Create new client(%d) from pid %d, uid %d, ", connId, pid,
- IPCThreadState::self()->getCallingUid());
+ ALOGV("Create new client(%d) from %s, ", connId,
+ verifiedIdentity.toString().c_str());
wp<Client> w = c;
{
@@ -543,8 +556,8 @@
char buffer[SIZE];
String8 result;
result.append(" Client\n");
- snprintf(buffer, 255, " pid(%d), connId(%d), status(%d), looping(%s)\n",
- mPid, mConnId, mStatus, mLoop?"true": "false");
+ snprintf(buffer, 255, " Identity(%s), connId(%d), status(%d), looping(%s)\n",
+ mIdentity.toString().c_str(), mConnId, mStatus, mLoop?"true": "false");
result.append(buffer);
sp<MediaPlayerBase> p;
@@ -608,7 +621,7 @@
for (int i = 0, n = mMediaRecorderClients.size(); i < n; ++i) {
sp<MediaRecorderClient> c = mMediaRecorderClients[i].promote();
if (c != 0) {
- snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mPid);
+ snprintf(buffer, 255, " MediaRecorderClient pid(%d)\n", c->mIdentity.pid);
result.append(buffer);
write(fd, result.string(), result.size());
result = "\n";
@@ -731,20 +744,18 @@
}
MediaPlayerService::Client::Client(
- const sp<MediaPlayerService>& service, pid_t pid,
+ const sp<MediaPlayerService>& service, const Identity& identity,
int32_t connId, const sp<IMediaPlayerClient>& client,
- audio_session_t audioSessionId, uid_t uid, const std::string& opPackageName)
- : mOpPackageName(opPackageName)
+ audio_session_t audioSessionId)
+ : mIdentity(identity)
{
ALOGV("Client(%d) constructor", connId);
- mPid = pid;
mConnId = connId;
mService = service;
mClient = client;
mLoop = false;
mStatus = NO_INIT;
mAudioSessionId = audioSessionId;
- mUid = uid;
mRetransmitEndpointValid = false;
mAudioAttributes = NULL;
mListener = new Listener(this);
@@ -757,7 +768,7 @@
MediaPlayerService::Client::~Client()
{
- ALOGV("Client(%d) destructor pid = %d", mConnId, mPid);
+ ALOGV("Client(%d) destructor identity = %s", mConnId, mIdentity.toString().c_str());
mAudioOutput.clear();
wp<Client> client(this);
disconnect();
@@ -770,7 +781,7 @@
void MediaPlayerService::Client::disconnect()
{
- ALOGV("disconnect(%d) from pid %d", mConnId, mPid);
+ ALOGV("disconnect(%d) from identity %s", mConnId, mIdentity.toString().c_str());
// grab local reference and clear main reference to prevent future
// access to object
sp<MediaPlayerBase> p;
@@ -810,11 +821,12 @@
p.clear();
}
if (p == NULL) {
- p = MediaPlayerFactory::createPlayer(playerType, mListener, mPid);
+ p = MediaPlayerFactory::createPlayer(playerType, mListener,
+ VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mIdentity.pid)));
}
if (p != NULL) {
- p->setUID(mUid);
+ p->setUID(VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(mIdentity.uid)));
}
return p;
@@ -922,8 +934,8 @@
mAudioDeviceUpdatedListener = new AudioDeviceUpdatedNotifier(p);
if (!p->hardwareOutput()) {
- mAudioOutput = new AudioOutput(mAudioSessionId, IPCThreadState::self()->getCallingUid(),
- mPid, mAudioAttributes, mAudioDeviceUpdatedListener, mOpPackageName);
+ mAudioOutput = new AudioOutput(mAudioSessionId, mIdentity,
+ mAudioAttributes, mAudioDeviceUpdatedListener);
static_cast<MediaPlayerInterface*>(p.get())->setAudioSink(mAudioOutput);
}
@@ -1772,9 +1784,8 @@
#undef LOG_TAG
#define LOG_TAG "AudioSink"
-MediaPlayerService::AudioOutput::AudioOutput(audio_session_t sessionId, uid_t uid, int pid,
- const audio_attributes_t* attr, const sp<AudioSystem::AudioDeviceCallback>& deviceCallback,
- const std::string& opPackageName)
+MediaPlayerService::AudioOutput::AudioOutput(audio_session_t sessionId, const Identity& identity,
+ const audio_attributes_t* attr, const sp<AudioSystem::AudioDeviceCallback>& deviceCallback)
: mCallback(NULL),
mCallbackCookie(NULL),
mCallbackData(NULL),
@@ -1786,8 +1797,7 @@
mMsecsPerFrame(0),
mFrameSize(0),
mSessionId(sessionId),
- mUid(uid),
- mPid(pid),
+ mIdentity(identity),
mSendLevel(0.0),
mAuxEffectId(0),
mFlags(AUDIO_OUTPUT_FLAG_NONE),
@@ -1795,8 +1805,7 @@
mSelectedDeviceId(AUDIO_PORT_HANDLE_NONE),
mRoutedDeviceId(AUDIO_PORT_HANDLE_NONE),
mDeviceCallbackEnabled(false),
- mDeviceCallback(deviceCallback),
- mOpPackageName(opPackageName)
+ mDeviceCallback(deviceCallback)
{
ALOGV("AudioOutput(%d)", sessionId);
if (attr != NULL) {
@@ -2185,13 +2194,11 @@
mSessionId,
AudioTrack::TRANSFER_CALLBACK,
offloadInfo,
- mUid,
- mPid,
+ mIdentity,
mAttributes,
doNotReconnect,
1.0f, // default value for maxRequiredSpeed
- mSelectedDeviceId,
- mOpPackageName);
+ mSelectedDeviceId);
} else {
// TODO: Due to buffer memory concerns, we use a max target playback speed
// based on mPlaybackRate at the time of open (instead of kMaxRequiredSpeed),
@@ -2214,13 +2221,11 @@
mSessionId,
AudioTrack::TRANSFER_DEFAULT,
NULL, // offload info
- mUid,
- mPid,
+ mIdentity,
mAttributes,
doNotReconnect,
targetSpeed,
- mSelectedDeviceId,
- mOpPackageName);
+ mSelectedDeviceId);
}
// Set caller name so it can be logged in destructor.
// MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_MEDIA
diff --git a/media/libmediaplayerservice/MediaPlayerService.h b/media/libmediaplayerservice/MediaPlayerService.h
index aca4369..35a65d3 100644
--- a/media/libmediaplayerservice/MediaPlayerService.h
+++ b/media/libmediaplayerservice/MediaPlayerService.h
@@ -27,12 +27,13 @@
#include <utils/String8.h>
#include <utils/Vector.h>
+#include <media/AidlConversion.h>
#include <media/AudioResamplerPublic.h>
#include <media/AudioSystem.h>
#include <media/MediaPlayerInterface.h>
#include <media/Metadata.h>
#include <media/stagefright/foundation/ABase.h>
-
+#include <android/media/permission/Identity.h>
#include <system/audio.h>
@@ -79,11 +80,9 @@
public:
AudioOutput(
audio_session_t sessionId,
- uid_t uid,
- int pid,
+ const media::permission::Identity& identity,
const audio_attributes_t * attr,
- const sp<AudioSystem::AudioDeviceCallback>& deviceCallback,
- const std::string& opPackageName);
+ const sp<AudioSystem::AudioDeviceCallback>& deviceCallback);
virtual ~AudioOutput();
virtual bool ready() const { return mTrack != 0; }
@@ -170,8 +169,7 @@
float mMsecsPerFrame;
size_t mFrameSize;
audio_session_t mSessionId;
- uid_t mUid;
- int mPid;
+ media::permission::Identity mIdentity;
float mSendLevel;
int mAuxEffectId;
audio_output_flags_t mFlags;
@@ -181,7 +179,6 @@
bool mDeviceCallbackEnabled;
wp<AudioSystem::AudioDeviceCallback> mDeviceCallback;
mutable Mutex mLock;
- const std::string mOpPackageName;
// static variables below not protected by mutex
static bool mIsOnEmulator;
@@ -234,13 +231,13 @@
static void instantiate();
// IMediaPlayerService interface
- virtual sp<IMediaRecorder> createMediaRecorder(const String16 &opPackageName);
+ virtual sp<IMediaRecorder> createMediaRecorder(const media::permission::Identity &identity);
void removeMediaRecorderClient(const wp<MediaRecorderClient>& client);
virtual sp<IMediaMetadataRetriever> createMetadataRetriever();
virtual sp<IMediaPlayer> create(const sp<IMediaPlayerClient>& client,
audio_session_t audioSessionId,
- const std::string opPackageName);
+ const media::permission::Identity& identity);
virtual sp<IMediaCodecList> getCodecList() const;
@@ -382,7 +379,9 @@
void notify(int msg, int ext1, int ext2, const Parcel *obj);
- pid_t pid() const { return mPid; }
+ pid_t pid() const {
+ return VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(mIdentity.pid));
+ }
virtual status_t dump(int fd, const Vector<String16>& args);
audio_session_t getAudioSessionId() { return mAudioSessionId; }
@@ -412,12 +411,10 @@
friend class MediaPlayerService;
Client( const sp<MediaPlayerService>& service,
- pid_t pid,
+ const media::permission::Identity& identity,
int32_t connId,
const sp<IMediaPlayerClient>& client,
- audio_session_t audioSessionId,
- uid_t uid,
- const std::string& opPackageName);
+ audio_session_t audioSessionId);
Client();
virtual ~Client();
@@ -461,20 +458,18 @@
sp<MediaPlayerService> mService;
sp<IMediaPlayerClient> mClient;
sp<AudioOutput> mAudioOutput;
- pid_t mPid;
+ const media::permission::Identity mIdentity;
status_t mStatus;
bool mLoop;
int32_t mConnId;
audio_session_t mAudioSessionId;
audio_attributes_t * mAudioAttributes;
- uid_t mUid;
sp<ANativeWindow> mConnectedWindow;
sp<IBinder> mConnectedWindowBinder;
struct sockaddr_in mRetransmitEndpoint;
bool mRetransmitEndpointValid;
sp<Client> mNextClient;
sp<MediaPlayerBase::Listener> mListener;
- const std::string mOpPackageName;
// Metadata filters.
media::Metadata::Filter mMetadataAllow; // protected by mLock
diff --git a/media/libmediaplayerservice/MediaRecorderClient.cpp b/media/libmediaplayerservice/MediaRecorderClient.cpp
index 1e72dd1..e2c8f8f 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.cpp
+++ b/media/libmediaplayerservice/MediaRecorderClient.cpp
@@ -124,12 +124,10 @@
ALOGE("Invalid audio source: %d", as);
return BAD_VALUE;
}
- pid_t pid = IPCThreadState::self()->getCallingPid();
- uid_t uid = IPCThreadState::self()->getCallingUid();
if ((as == AUDIO_SOURCE_FM_TUNER
- && !(captureAudioOutputAllowed(pid, uid) || captureTunerAudioInputAllowed(pid, uid)))
- || !recordingAllowed(String16(""), pid, uid)) {
+ && !(captureAudioOutputAllowed(mIdentity) || captureTunerAudioInputAllowed(mIdentity)))
+ || !recordingAllowed(mIdentity)) {
return PERMISSION_DENIED;
}
Mutex::Autolock lock(mLock);
@@ -378,12 +376,13 @@
return NO_ERROR;
}
-MediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service, pid_t pid,
- const String16& opPackageName)
+MediaRecorderClient::MediaRecorderClient(const sp<MediaPlayerService>& service,
+ const Identity& identity)
{
ALOGV("Client constructor");
- mPid = pid;
- mRecorder = new StagefrightRecorder(opPackageName);
+ // identity already validated in createMediaRecorder
+ mIdentity = identity;
+ mRecorder = new StagefrightRecorder(identity);
mMediaPlayerService = service;
}
diff --git a/media/libmediaplayerservice/MediaRecorderClient.h b/media/libmediaplayerservice/MediaRecorderClient.h
index e041855..24c6ee1 100644
--- a/media/libmediaplayerservice/MediaRecorderClient.h
+++ b/media/libmediaplayerservice/MediaRecorderClient.h
@@ -22,6 +22,7 @@
#include <media/AudioSystem.h>
#include <media/IMediaRecorder.h>
+#include <android/media/permission/Identity.h>
#include <vector>
@@ -93,14 +94,13 @@
MediaRecorderClient(
const sp<MediaPlayerService>& service,
- pid_t pid,
- const String16& opPackageName);
+ const media::permission::Identity& identity);
virtual ~MediaRecorderClient();
std::vector<DeathNotifier> mDeathNotifiers;
sp<AudioDeviceUpdatedNotifier> mAudioDeviceUpdatedNotifier;
- pid_t mPid;
+ media::permission::Identity mIdentity;
mutable Mutex mLock;
MediaRecorderBase *mRecorder;
sp<MediaPlayerService> mMediaPlayerService;
diff --git a/media/libmediaplayerservice/StagefrightRecorder.cpp b/media/libmediaplayerservice/StagefrightRecorder.cpp
index ecbdf61..b485b1e 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.cpp
+++ b/media/libmediaplayerservice/StagefrightRecorder.cpp
@@ -33,6 +33,7 @@
#include <binder/IPCThreadState.h>
#include <binder/IServiceManager.h>
+#include <media/AidlConversion.h>
#include <media/IMediaPlayerService.h>
#include <media/MediaMetricsItem.h>
#include <media/stagefright/foundation/ABuffer.h>
@@ -114,8 +115,8 @@
}
-StagefrightRecorder::StagefrightRecorder(const String16 &opPackageName)
- : MediaRecorderBase(opPackageName),
+StagefrightRecorder::StagefrightRecorder(const Identity& clientIdentity)
+ : MediaRecorderBase(clientIdentity),
mWriter(NULL),
mOutputFd(-1),
mAudioSource((audio_source_t)AUDIO_SOURCE_CNT), // initialize with invalid value
@@ -157,7 +158,7 @@
// we run as part of the media player service; what we really want to
// know is the app which requested the recording.
- mMetricsItem->setUid(mClientUid);
+ mMetricsItem->setUid(VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(mClient.uid)));
// populate the values from the raw fields.
@@ -1129,7 +1130,8 @@
}
status_t StagefrightRecorder::setClientName(const String16& clientName) {
- mClientName = clientName;
+
+ mClient.packageName = VALUE_OR_RETURN_STATUS(legacy2aidl_String16_string(clientName));
return OK;
}
@@ -1141,10 +1143,6 @@
return INVALID_OPERATION;
}
- // Get UID and PID here for permission checking
- mClientUid = IPCThreadState::self()->getCallingUid();
- mClientPid = IPCThreadState::self()->getCallingPid();
-
status_t status = OK;
switch (mOutputFormat) {
@@ -1344,12 +1342,10 @@
sp<AudioSource> audioSource =
new AudioSource(
&attr,
- mOpPackageName,
+ mClient,
sourceSampleRate,
mAudioChannels,
mSampleRate,
- mClientUid,
- mClientPid,
mSelectedDeviceId,
mSelectedMicDirection,
mSelectedMicFieldDimension);
@@ -1871,6 +1867,10 @@
Size videoSize;
videoSize.width = mVideoWidth;
videoSize.height = mVideoHeight;
+ uid_t uid = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_uid_t(mClient.uid));
+ pid_t pid = VALUE_OR_RETURN_STATUS(aidl2legacy_int32_t_pid_t(mClient.pid));
+ String16 clientName = VALUE_OR_RETURN_STATUS(
+ aidl2legacy_string_view_String16(mClient.packageName.value_or("")));
if (mCaptureFpsEnable) {
if (!(mCaptureFps > 0.)) {
ALOGE("Invalid mCaptureFps value: %lf", mCaptureFps);
@@ -1878,13 +1878,13 @@
}
mCameraSourceTimeLapse = CameraSourceTimeLapse::CreateFromCamera(
- mCamera, mCameraProxy, mCameraId, mClientName, mClientUid, mClientPid,
+ mCamera, mCameraProxy, mCameraId, clientName, uid, pid,
videoSize, mFrameRate, mPreviewSurface,
std::llround(1e6 / mCaptureFps));
*cameraSource = mCameraSourceTimeLapse;
} else {
*cameraSource = CameraSource::CreateFromCamera(
- mCamera, mCameraProxy, mCameraId, mClientName, mClientUid, mClientPid,
+ mCamera, mCameraProxy, mCameraId, clientName, uid, pid,
videoSize, mFrameRate,
mPreviewSurface);
}
diff --git a/media/libmediaplayerservice/StagefrightRecorder.h b/media/libmediaplayerservice/StagefrightRecorder.h
index 4bba869..278f348 100644
--- a/media/libmediaplayerservice/StagefrightRecorder.h
+++ b/media/libmediaplayerservice/StagefrightRecorder.h
@@ -26,6 +26,9 @@
#include <system/audio.h>
#include <media/hardware/MetadataBufferType.h>
+#include <android/media/permission/Identity.h>
+
+using namespace android::media::permission;
namespace android {
@@ -42,7 +45,7 @@
struct ALooper;
struct StagefrightRecorder : public MediaRecorderBase {
- explicit StagefrightRecorder(const String16 &opPackageName);
+ explicit StagefrightRecorder(const Identity& clientIdentity);
virtual ~StagefrightRecorder();
virtual status_t init();
virtual status_t setAudioSource(audio_source_t as);
@@ -98,9 +101,6 @@
sp<IGraphicBufferProducer> mPreviewSurface;
sp<PersistentSurface> mPersistentSurface;
sp<IMediaRecorderClient> mListener;
- String16 mClientName;
- uid_t mClientUid;
- pid_t mClientPid;
sp<MediaWriter> mWriter;
int mOutputFd;
sp<AudioSource> mAudioSourceNode;
diff --git a/media/libmediaplayerservice/tests/stagefrightRecorder/Android.bp b/media/libmediaplayerservice/tests/stagefrightRecorder/Android.bp
index b84d64b..5b16911 100644
--- a/media/libmediaplayerservice/tests/stagefrightRecorder/Android.bp
+++ b/media/libmediaplayerservice/tests/stagefrightRecorder/Android.bp
@@ -73,6 +73,8 @@
"libstagefright",
"libstagefright_foundation",
"libutils",
+ "media_permission-aidl-cpp",
+ "libaudioclient_aidl_conversion",
],
cflags: [
diff --git a/media/libmediaplayerservice/tests/stagefrightRecorder/StagefrightRecorderTest.cpp b/media/libmediaplayerservice/tests/stagefrightRecorder/StagefrightRecorderTest.cpp
index 5751631..6dea53d 100644
--- a/media/libmediaplayerservice/tests/stagefrightRecorder/StagefrightRecorderTest.cpp
+++ b/media/libmediaplayerservice/tests/stagefrightRecorder/StagefrightRecorderTest.cpp
@@ -59,7 +59,10 @@
}
void SetUp() override {
- mStfRecorder = new StagefrightRecorder(String16(LOG_TAG));
+ // TODO b/182392769: use identity util
+ Identity identity;
+ identity.packageName = std::string(LOG_TAG);
+ mStfRecorder = new StagefrightRecorder(identity);
ASSERT_NE(mStfRecorder, nullptr) << "Failed to create the instance of recorder";
mOutputAudioFp = fopen(OUTPUT_FILE_NAME_AUDIO, "wb");
diff --git a/media/libstagefright/Android.bp b/media/libstagefright/Android.bp
index 489a4bd..930bc0f 100644
--- a/media/libstagefright/Android.bp
+++ b/media/libstagefright/Android.bp
@@ -337,6 +337,8 @@
"android.hardware.cas.native@1.0",
"android.hardware.drm@1.0",
"android.hardware.media.omx@1.0",
+ "media_permission-aidl-cpp",
+ "libaudioclient_aidl_conversion",
],
static_libs: [
@@ -349,6 +351,7 @@
"libogg",
"libwebm",
"libstagefright_id3",
+ "media_permission-aidl-cpp",
],
header_libs:[
@@ -363,6 +366,7 @@
"libhidlmemory",
"libmedia",
"android.hidl.allocator@1.0",
+ "media_permission-aidl-cpp",
],
export_include_dirs: [
diff --git a/media/libstagefright/AudioSource.cpp b/media/libstagefright/AudioSource.cpp
index 4bc861e..89fe56f 100644
--- a/media/libstagefright/AudioSource.cpp
+++ b/media/libstagefright/AudioSource.cpp
@@ -21,6 +21,8 @@
#define LOG_TAG "AudioSource"
#include <utils/Log.h>
+#include <binder/IPCThreadState.h>
+#include <media/AidlConversion.h>
#include <media/AudioRecord.h>
#include <media/stagefright/AudioSource.h>
#include <media/stagefright/MediaBuffer.h>
@@ -32,6 +34,8 @@
namespace android {
+using android::media::permission::Identity;
+
static void AudioRecordCallbackFunction(int event, void *user, void *info) {
AudioSource *source = (AudioSource *) user;
switch (event) {
@@ -50,74 +54,100 @@
}
AudioSource::AudioSource(
+ const audio_attributes_t *attr, const Identity& identity,
+ uint32_t sampleRate, uint32_t channelCount, uint32_t outSampleRate,
+ audio_port_handle_t selectedDeviceId,
+ audio_microphone_direction_t selectedMicDirection,
+ float selectedMicFieldDimension)
+{
+ set(attr, identity, sampleRate, channelCount, outSampleRate, selectedDeviceId,
+ selectedMicDirection, selectedMicFieldDimension);
+}
+
+AudioSource::AudioSource(
const audio_attributes_t *attr, const String16 &opPackageName,
uint32_t sampleRate, uint32_t channelCount, uint32_t outSampleRate,
uid_t uid, pid_t pid, audio_port_handle_t selectedDeviceId,
audio_microphone_direction_t selectedMicDirection,
float selectedMicFieldDimension)
- : mStarted(false),
- mSampleRate(sampleRate),
- mOutSampleRate(outSampleRate > 0 ? outSampleRate : sampleRate),
- mTrackMaxAmplitude(false),
- mStartTimeUs(0),
- mStopSystemTimeUs(-1),
- mLastFrameTimestampUs(0),
- mMaxAmplitude(0),
- mPrevSampleTimeUs(0),
- mInitialReadTimeUs(0),
- mNumFramesReceived(0),
- mNumFramesSkipped(0),
- mNumFramesLost(0),
- mNumClientOwnedBuffers(0),
- mNoMoreFramesToRead(false) {
- ALOGV("sampleRate: %u, outSampleRate: %u, channelCount: %u",
- sampleRate, outSampleRate, channelCount);
- CHECK(channelCount == 1 || channelCount == 2);
- CHECK(sampleRate > 0);
+{
+ // TODO b/182392769: use identity util
+ Identity identity;
+ identity.packageName = VALUE_OR_FATAL(legacy2aidl_String16_string(opPackageName));
+ identity.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(uid));
+ identity.pid = VALUE_OR_FATAL(legacy2aidl_pid_t_int32_t(pid));
+ set(attr, identity, sampleRate, channelCount, outSampleRate, selectedDeviceId,
+ selectedMicDirection, selectedMicFieldDimension);
+}
- size_t minFrameCount;
- status_t status = AudioRecord::getMinFrameCount(&minFrameCount,
- sampleRate,
- AUDIO_FORMAT_PCM_16_BIT,
- audio_channel_in_mask_from_count(channelCount));
- if (status == OK) {
- // make sure that the AudioRecord callback never returns more than the maximum
- // buffer size
- uint32_t frameCount = kMaxBufferSize / sizeof(int16_t) / channelCount;
+void AudioSource::set(
+ const audio_attributes_t *attr, const Identity& identity,
+ uint32_t sampleRate, uint32_t channelCount, uint32_t outSampleRate,
+ audio_port_handle_t selectedDeviceId,
+ audio_microphone_direction_t selectedMicDirection,
+ float selectedMicFieldDimension)
+{
+ mStarted = false;
+ mSampleRate = sampleRate;
+ mOutSampleRate = outSampleRate > 0 ? outSampleRate : sampleRate;
+ mTrackMaxAmplitude = false;
+ mStartTimeUs = 0;
+ mStopSystemTimeUs = -1;
+ mLastFrameTimestampUs = 0;
+ mMaxAmplitude = 0;
+ mPrevSampleTimeUs = 0;
+ mInitialReadTimeUs = 0;
+ mNumFramesReceived = 0;
+ mNumFramesSkipped = 0;
+ mNumFramesLost = 0;
+ mNumClientOwnedBuffers = 0;
+ mNoMoreFramesToRead = false;
+ ALOGV("sampleRate: %u, outSampleRate: %u, channelCount: %u",
+ sampleRate, outSampleRate, channelCount);
+ CHECK(channelCount == 1 || channelCount == 2);
+ CHECK(sampleRate > 0);
- // make sure that the AudioRecord total buffer size is large enough
- size_t bufCount = 2;
- while ((bufCount * frameCount) < minFrameCount) {
- bufCount++;
- }
+ size_t minFrameCount;
+ status_t status = AudioRecord::getMinFrameCount(&minFrameCount,
+ sampleRate,
+ AUDIO_FORMAT_PCM_16_BIT,
+ audio_channel_in_mask_from_count(channelCount));
+ if (status == OK) {
+ // make sure that the AudioRecord callback never returns more than the maximum
+ // buffer size
+ uint32_t frameCount = kMaxBufferSize / sizeof(int16_t) / channelCount;
- mRecord = new AudioRecord(
- AUDIO_SOURCE_DEFAULT, sampleRate, AUDIO_FORMAT_PCM_16_BIT,
- audio_channel_in_mask_from_count(channelCount),
- opPackageName,
- (size_t) (bufCount * frameCount),
- AudioRecordCallbackFunction,
- this,
- frameCount /*notificationFrames*/,
- AUDIO_SESSION_ALLOCATE,
- AudioRecord::TRANSFER_DEFAULT,
- AUDIO_INPUT_FLAG_NONE,
- uid,
- pid,
- attr,
- selectedDeviceId,
- selectedMicDirection,
- selectedMicFieldDimension);
- // Set caller name so it can be logged in destructor.
- // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_MEDIA
- mRecord->setCallerName("media");
- mInitCheck = mRecord->initCheck();
- if (mInitCheck != OK) {
- mRecord.clear();
- }
- } else {
- mInitCheck = status;
+ // make sure that the AudioRecord total buffer size is large enough
+ size_t bufCount = 2;
+ while ((bufCount * frameCount) < minFrameCount) {
+ bufCount++;
}
+
+ mRecord = new AudioRecord(
+ AUDIO_SOURCE_DEFAULT, sampleRate, AUDIO_FORMAT_PCM_16_BIT,
+ audio_channel_in_mask_from_count(channelCount),
+ identity,
+ (size_t) (bufCount * frameCount),
+ AudioRecordCallbackFunction,
+ this,
+ frameCount /*notificationFrames*/,
+ AUDIO_SESSION_ALLOCATE,
+ AudioRecord::TRANSFER_DEFAULT,
+ AUDIO_INPUT_FLAG_NONE,
+ attr,
+ selectedDeviceId,
+ selectedMicDirection,
+ selectedMicFieldDimension);
+ // Set caller name so it can be logged in destructor.
+ // MediaMetricsConstants.h: AMEDIAMETRICS_PROP_CALLERNAME_VALUE_MEDIA
+ mRecord->setCallerName("media");
+ mInitCheck = mRecord->initCheck();
+ if (mInitCheck != OK) {
+ mRecord.clear();
+ }
+ } else {
+ mInitCheck = status;
+ }
}
AudioSource::~AudioSource() {
diff --git a/media/libstagefright/include/media/stagefright/AudioSource.h b/media/libstagefright/include/media/stagefright/AudioSource.h
index 451aa57..d1dcdb5 100644
--- a/media/libstagefright/include/media/stagefright/AudioSource.h
+++ b/media/libstagefright/include/media/stagefright/AudioSource.h
@@ -37,16 +37,27 @@
// Note that the "channels" parameter _is_ the number of channels,
// _not_ a bitmask of audio_channels_t constants.
AudioSource(
- const audio_attributes_t *attr,
- const String16 &opPackageName,
- uint32_t sampleRate,
- uint32_t channels,
- uint32_t outSampleRate = 0,
- uid_t uid = -1,
- pid_t pid = -1,
- audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
- audio_microphone_direction_t selectedMicDirection = MIC_DIRECTION_UNSPECIFIED,
- float selectedMicFieldDimension = MIC_FIELD_DIMENSION_NORMAL);
+ const audio_attributes_t *attr,
+ const media::permission::Identity& identity,
+ uint32_t sampleRate,
+ uint32_t channels,
+ uint32_t outSampleRate = 0,
+ audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
+ audio_microphone_direction_t selectedMicDirection = MIC_DIRECTION_UNSPECIFIED,
+ float selectedMicFieldDimension = MIC_FIELD_DIMENSION_NORMAL);
+
+ // Legacy constructor kept for vendor dependencies
+ AudioSource(
+ const audio_attributes_t *attr,
+ const String16 &opPackageName,
+ uint32_t sampleRate,
+ uint32_t channels,
+ uint32_t outSampleRate = 0,
+ uid_t uid = -1,
+ pid_t pid = -1,
+ audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
+ audio_microphone_direction_t selectedMicDirection = MIC_DIRECTION_UNSPECIFIED,
+ float selectedMicFieldDimension = MIC_FIELD_DIMENSION_NORMAL);
status_t initCheck() const;
@@ -131,6 +142,16 @@
AudioSource(const AudioSource &);
AudioSource &operator=(const AudioSource &);
+
+ void set(
+ const audio_attributes_t *attr,
+ const media::permission::Identity& identity,
+ uint32_t sampleRate,
+ uint32_t channels,
+ uint32_t outSampleRate = 0,
+ audio_port_handle_t selectedDeviceId = AUDIO_PORT_HANDLE_NONE,
+ audio_microphone_direction_t selectedMicDirection = MIC_DIRECTION_UNSPECIFIED,
+ float selectedMicFieldDimension = MIC_FIELD_DIMENSION_NORMAL);
};
} // namespace android
diff --git a/media/libstagefright/tests/fuzzers/Android.bp b/media/libstagefright/tests/fuzzers/Android.bp
index 65e74e6..0097830 100644
--- a/media/libstagefright/tests/fuzzers/Android.bp
+++ b/media/libstagefright/tests/fuzzers/Android.bp
@@ -30,6 +30,7 @@
"libgui",
"libbinder",
"liblog",
+ "media_permission-aidl-cpp",
],
include_dirs: [
"frameworks/av/media/libstagefright",
diff --git a/media/libstagefright/tests/fuzzers/WriterFuzzer.cpp b/media/libstagefright/tests/fuzzers/WriterFuzzer.cpp
index 03e9b43..969c6e1 100644
--- a/media/libstagefright/tests/fuzzers/WriterFuzzer.cpp
+++ b/media/libstagefright/tests/fuzzers/WriterFuzzer.cpp
@@ -17,6 +17,7 @@
// dylan.katz@leviathansecurity.com
#include <android-base/file.h>
+#include <android/media/permission/Identity.h>
#include <ctype.h>
#include <media/mediarecorder.h>
#include <media/stagefright/MPEG4Writer.h>
@@ -39,6 +40,8 @@
namespace android {
+using media::permission::Identity;
+
std::string getFourCC(FuzzedDataProvider *fdp) {
std::string fourCC = fdp->ConsumeRandomLengthString(4);
// Replace any existing nulls
@@ -163,9 +166,11 @@
StandardWriters writerType = dataProvider.ConsumeEnum<StandardWriters>();
sp<MediaWriter> writer = createWriter(tf.fd, writerType, fileMeta);
- std::string packageName = dataProvider.ConsumeRandomLengthString(kMaxPackageNameLen);
-
- sp<MediaRecorder> mr = new MediaRecorder(String16(packageName.c_str()));
+ Identity i;
+ i.packageName = dataProvider.ConsumeRandomLengthString(kMaxPackageNameLen);
+ i.uid = dataProvider.ConsumeIntegral<int32_t>();
+ i.pid = dataProvider.ConsumeIntegral<int32_t>();
+ sp<MediaRecorder> mr = new MediaRecorder(i);
writer->setListener(mr);
uint8_t baseOpLen = operations.size();
diff --git a/media/libstagefright/webm/Android.bp b/media/libstagefright/webm/Android.bp
index 68752cd..3ceacfe 100644
--- a/media/libstagefright/webm/Android.bp
+++ b/media/libstagefright/webm/Android.bp
@@ -40,6 +40,7 @@
"libstagefright_foundation",
"libutils",
"liblog",
+ "media_permission-aidl-cpp",
],
header_libs: [
diff --git a/media/utils/Android.bp b/media/utils/Android.bp
index ec77bd0..26cdc3a 100644
--- a/media/utils/Android.bp
+++ b/media/utils/Android.bp
@@ -39,6 +39,7 @@
"libc_malloc_debug_backtrace",
],
shared_libs: [
+ "libaudioclient_aidl_conversion",
"libaudioutils", // for clock.h
"libbinder",
"libcutils",
@@ -47,6 +48,7 @@
"libhidlbase",
"android.hardware.graphics.bufferqueue@1.0",
"android.hidl.token@1.0-utils",
+ "media_permission-aidl-cpp",
],
logtags: ["EventLogTags.logtags"],
@@ -62,6 +64,10 @@
"libmedia_headers",
],
+ export_shared_lib_headers: [
+ "media_permission-aidl-cpp"
+ ],
+
include_dirs: [
// For DEBUGGER_SIGNAL
"system/core/debuggerd/include",
diff --git a/media/utils/ServiceUtilities.cpp b/media/utils/ServiceUtilities.cpp
index 2c8a452..e2e1043 100644
--- a/media/utils/ServiceUtilities.cpp
+++ b/media/utils/ServiceUtilities.cpp
@@ -23,6 +23,9 @@
#include <binder/PermissionCache.h>
#include "mediautils/ServiceUtilities.h"
#include <system/audio-hal-enums.h>
+#include <media/AidlConversion.h>
+#include <media/AidlConversionUtil.h>
+#include <android/media/permission/Identity.h>
#include <iterator>
#include <algorithm>
@@ -37,14 +40,16 @@
namespace android {
+using media::permission::Identity;
+
static const String16 sAndroidPermissionRecordAudio("android.permission.RECORD_AUDIO");
static const String16 sModifyPhoneState("android.permission.MODIFY_PHONE_STATE");
static const String16 sModifyAudioRouting("android.permission.MODIFY_AUDIO_ROUTING");
static String16 resolveCallingPackage(PermissionController& permissionController,
- const String16& opPackageName, uid_t uid) {
- if (opPackageName.size() > 0) {
- return opPackageName;
+ const std::optional<String16> opPackageName, uid_t uid) {
+ if (opPackageName.has_value() && opPackageName.value().size() > 0) {
+ return opPackageName.value();
}
// In some cases the calling code has no access to the package it runs under.
// For example, code using the wilhelm framework's OpenSL-ES APIs. In this
@@ -57,7 +62,7 @@
permissionController.getPackagesForUid(uid, packages);
if (packages.isEmpty()) {
ALOGE("No packages for uid %d", uid);
- return opPackageName; // empty string
+ return String16();
}
return packages[0];
}
@@ -74,47 +79,52 @@
}
}
-static bool checkRecordingInternal(const String16& opPackageName, pid_t pid,
- uid_t uid, bool start, audio_source_t source) {
+static bool checkRecordingInternal(const Identity& identity, const String16& msg,
+ bool start, audio_source_t source) {
// Okay to not track in app ops as audio server or media server is us and if
// device is rooted security model is considered compromised.
// system_server loses its RECORD_AUDIO permission when a secondary
// user is active, but it is a core system service so let it through.
// TODO(b/141210120): UserManager.DISALLOW_RECORD_AUDIO should not affect system user 0
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
if (isAudioServerOrMediaServerOrSystemServerOrRootUid(uid)) return true;
// We specify a pid and uid here as mediaserver (aka MediaRecorder or StageFrightRecorder)
// may open a record track on behalf of a client. Note that pid may be a tid.
// IMPORTANT: DON'T USE PermissionCache - RUNTIME PERMISSIONS CHANGE.
PermissionController permissionController;
- const bool ok = permissionController.checkPermission(sAndroidPermissionRecordAudio, pid, uid);
+ const bool ok = permissionController.checkPermission(sAndroidPermissionRecordAudio,
+ identity.pid, identity.uid);
if (!ok) {
ALOGE("Request requires %s", String8(sAndroidPermissionRecordAudio).c_str());
return false;
}
String16 resolvedOpPackageName = resolveCallingPackage(
- permissionController, opPackageName, uid);
+ permissionController, VALUE_OR_FATAL(aidl2legacy_string_view_String16(
+ identity.packageName.value_or(""))), uid);
if (resolvedOpPackageName.size() == 0) {
return false;
}
+
AppOpsManager appOps;
const int32_t op = getOpForSource(source);
if (start) {
- if (int32_t mode = appOps.startOpNoThrow(
- op, uid, resolvedOpPackageName, /*startIfModeDefault*/ false);
- mode != AppOpsManager::MODE_ALLOWED) {
+ if (int32_t mode = appOps.startOpNoThrow(op, identity.uid,
+ resolvedOpPackageName, /*startIfModeDefault*/ false,
+ VALUE_OR_FATAL(aidl2legacy_optional_string_view_optional_String16(
+ identity.attributionTag)), msg) != AppOpsManager::MODE_ALLOWED) {
ALOGE("Request start for \"%s\" (uid %d) denied by app op: %d, mode: %d",
- String8(resolvedOpPackageName).c_str(), uid, op, mode);
+ String8(resolvedOpPackageName).c_str(), identity.uid, op, mode);
return false;
}
} else {
// Always use OP_RECORD_AUDIO for checks at creation time.
- if (int32_t mode = appOps.checkOp(op, uid, resolvedOpPackageName);
- mode != AppOpsManager::MODE_ALLOWED) {
+ if (int32_t mode = appOps.checkOp(op, uid,
+ resolvedOpPackageName) != AppOpsManager::MODE_ALLOWED) {
ALOGE("Request check for \"%s\" (uid %d) denied by app op: %d, mode: %d",
- String8(resolvedOpPackageName).c_str(), uid, op, mode);
+ String8(resolvedOpPackageName).c_str(), identity.uid, op, mode);
return false;
}
}
@@ -122,22 +132,25 @@
return true;
}
-bool recordingAllowed(const String16& opPackageName, pid_t pid, uid_t uid) {
- return checkRecordingInternal(opPackageName, pid, uid, /*start*/ false, AUDIO_SOURCE_DEFAULT);
+bool recordingAllowed(const Identity& identity) {
+ return checkRecordingInternal(identity, String16(), /*start*/ false, AUDIO_SOURCE_DEFAULT);
}
-bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid, audio_source_t source) {
- return checkRecordingInternal(opPackageName, pid, uid, /*start*/ true, source);
+bool startRecording(const Identity& identity, const String16& msg, audio_source_t source) {
+ return checkRecordingInternal(identity, msg, /*start*/ true, source);
}
-void finishRecording(const String16& opPackageName, uid_t uid, audio_source_t source) {
+void finishRecording(const Identity& identity, audio_source_t source) {
// Okay to not track in app ops as audio server is us and if
// device is rooted security model is considered compromised.
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
if (isAudioServerOrRootUid(uid)) return;
PermissionController permissionController;
String16 resolvedOpPackageName = resolveCallingPackage(
- permissionController, opPackageName, uid);
+ permissionController,
+ VALUE_OR_FATAL(aidl2legacy_string_view_String16(identity.packageName.value_or(""))),
+ VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid)));
if (resolvedOpPackageName.size() == 0) {
return;
}
@@ -145,10 +158,14 @@
AppOpsManager appOps;
const int32_t op = getOpForSource(source);
- appOps.finishOp(op, uid, resolvedOpPackageName);
+ appOps.finishOp(op, identity.uid, resolvedOpPackageName,
+ VALUE_OR_FATAL(aidl2legacy_optional_string_view_optional_String16(
+ identity.attributionTag)));
}
-bool captureAudioOutputAllowed(pid_t pid, uid_t uid) {
+bool captureAudioOutputAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
if (isAudioServerOrRootUid(uid)) return true;
static const String16 sCaptureAudioOutput("android.permission.CAPTURE_AUDIO_OUTPUT");
bool ok = PermissionCache::checkPermission(sCaptureAudioOutput, pid, uid);
@@ -156,7 +173,9 @@
return ok;
}
-bool captureMediaOutputAllowed(pid_t pid, uid_t uid) {
+bool captureMediaOutputAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
if (isAudioServerOrRootUid(uid)) return true;
static const String16 sCaptureMediaOutput("android.permission.CAPTURE_MEDIA_OUTPUT");
bool ok = PermissionCache::checkPermission(sCaptureMediaOutput, pid, uid);
@@ -164,7 +183,9 @@
return ok;
}
-bool captureTunerAudioInputAllowed(pid_t pid, uid_t uid) {
+bool captureTunerAudioInputAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
if (isAudioServerOrRootUid(uid)) return true;
static const String16 sCaptureTunerAudioInput("android.permission.CAPTURE_TUNER_AUDIO_INPUT");
bool ok = PermissionCache::checkPermission(sCaptureTunerAudioInput, pid, uid);
@@ -172,7 +193,9 @@
return ok;
}
-bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid) {
+bool captureVoiceCommunicationOutputAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ uid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
if (isAudioServerOrRootUid(uid)) return true;
static const String16 sCaptureVoiceCommOutput(
"android.permission.CAPTURE_VOICE_COMMUNICATION_OUTPUT");
@@ -181,9 +204,11 @@
return ok;
}
-bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid) {
+bool captureHotwordAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ uid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
// CAPTURE_AUDIO_HOTWORD permission implies RECORD_AUDIO permission
- bool ok = recordingAllowed(opPackageName, pid, uid);
+ bool ok = recordingAllowed(identity);
if (ok) {
static const String16 sCaptureHotwordAllowed("android.permission.CAPTURE_AUDIO_HOTWORD");
@@ -205,11 +230,12 @@
}
bool modifyAudioRoutingAllowed() {
- return modifyAudioRoutingAllowed(
- IPCThreadState::self()->getCallingPid(), IPCThreadState::self()->getCallingUid());
+ return modifyAudioRoutingAllowed(getCallingIdentity());
}
-bool modifyAudioRoutingAllowed(pid_t pid, uid_t uid) {
+bool modifyAudioRoutingAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
if (isAudioServerUid(IPCThreadState::self()->getCallingUid())) return true;
// IMPORTANT: Use PermissionCache - not a runtime permission and may not change.
bool ok = PermissionCache::checkPermission(sModifyAudioRouting, pid, uid);
@@ -219,11 +245,12 @@
}
bool modifyDefaultAudioEffectsAllowed() {
- return modifyDefaultAudioEffectsAllowed(
- IPCThreadState::self()->getCallingPid(), IPCThreadState::self()->getCallingUid());
+ return modifyDefaultAudioEffectsAllowed(getCallingIdentity());
}
-bool modifyDefaultAudioEffectsAllowed(pid_t pid, uid_t uid) {
+bool modifyDefaultAudioEffectsAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
if (isAudioServerUid(IPCThreadState::self()->getCallingUid())) return true;
static const String16 sModifyDefaultAudioEffectsAllowed(
@@ -244,14 +271,18 @@
return ok;
}
-bool modifyPhoneStateAllowed(pid_t pid, uid_t uid) {
+bool modifyPhoneStateAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
bool ok = PermissionCache::checkPermission(sModifyPhoneState, pid, uid);
ALOGE_IF(!ok, "Request requires %s", String8(sModifyPhoneState).c_str());
return ok;
}
// privileged behavior needed by Dialer, Settings, SetupWizard and CellBroadcastReceiver
-bool bypassInterruptionPolicyAllowed(pid_t pid, uid_t uid) {
+bool bypassInterruptionPolicyAllowed(const Identity& identity) {
+ uid_t uid = VALUE_OR_FATAL(aidl2legacy_int32_t_uid_t(identity.uid));
+ pid_t pid = VALUE_OR_FATAL(aidl2legacy_int32_t_pid_t(identity.pid));
static const String16 sWriteSecureSettings("android.permission.WRITE_SECURE_SETTINGS");
bool ok = PermissionCache::checkPermission(sModifyPhoneState, pid, uid)
|| PermissionCache::checkPermission(sWriteSecureSettings, pid, uid)
@@ -261,6 +292,13 @@
return ok;
}
+Identity getCallingIdentity() {
+ Identity identity = Identity();
+ identity.pid = VALUE_OR_FATAL(legacy2aidl_pid_t_int32_t(IPCThreadState::self()->getCallingPid()));
+ identity.uid = VALUE_OR_FATAL(legacy2aidl_uid_t_int32_t(IPCThreadState::self()->getCallingUid()));
+ return identity;
+}
+
status_t checkIMemory(const sp<IMemory>& iMemory)
{
if (iMemory == 0) {
diff --git a/media/utils/fuzzers/Android.bp b/media/utils/fuzzers/Android.bp
index 80882b2..187ef7c 100644
--- a/media/utils/fuzzers/Android.bp
+++ b/media/utils/fuzzers/Android.bp
@@ -15,6 +15,7 @@
"liblog",
"libmediautils",
"libutils",
+ "media_permission-aidl-cpp",
],
cflags: [
diff --git a/media/utils/fuzzers/ServiceUtilitiesFuzz.cpp b/media/utils/fuzzers/ServiceUtilitiesFuzz.cpp
index f4c815c..2f9e780 100644
--- a/media/utils/fuzzers/ServiceUtilitiesFuzz.cpp
+++ b/media/utils/fuzzers/ServiceUtilitiesFuzz.cpp
@@ -19,12 +19,15 @@
#include <functional>
#include <type_traits>
+#include <android/media/permission/Identity.h>
#include "fuzzer/FuzzedDataProvider.h"
#include "mediautils/ServiceUtilities.h"
static constexpr int kMaxOperations = 50;
static constexpr int kMaxStringLen = 256;
+using android::media::permission::Identity;
+
const std::vector<std::function<void(FuzzedDataProvider*, android::MediaPackageManager)>>
operations = {
[](FuzzedDataProvider* data_provider, android::MediaPackageManager pm) -> void {
@@ -43,27 +46,33 @@
extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size) {
FuzzedDataProvider data_provider(data, size);
- uid_t uid = data_provider.ConsumeIntegral<uid_t>();
- pid_t pid = data_provider.ConsumeIntegral<pid_t>();
+ int32_t uid = data_provider.ConsumeIntegral<int32_t>();
+ int32_t pid = data_provider.ConsumeIntegral<int32_t>();
audio_source_t source = static_cast<audio_source_t>(data_provider
.ConsumeIntegral<std::underlying_type_t<audio_source_t>>());
+ std::string packageNameStr = data_provider.ConsumeRandomLengthString(kMaxStringLen);
+ std::string msgStr = data_provider.ConsumeRandomLengthString(kMaxStringLen);
+ android::String16 msgStr16(packageNameStr.c_str());
+ Identity identity;
+ identity.packageName = packageNameStr;
+ identity.uid = uid;
+ identity.pid = pid;
+
// There is not state here, and order is not significant,
// so we can simply call all of the target functions
android::isServiceUid(uid);
android::isAudioServerUid(uid);
android::isAudioServerOrSystemServerUid(uid);
android::isAudioServerOrMediaServerUid(uid);
- std::string packageNameStr = data_provider.ConsumeRandomLengthString(kMaxStringLen);
- android::String16 opPackageName(packageNameStr.c_str());
- android::recordingAllowed(opPackageName, pid, uid);
- android::startRecording(opPackageName, pid, uid, source);
- android::finishRecording(opPackageName, uid, source);
- android::captureAudioOutputAllowed(pid, uid);
- android::captureMediaOutputAllowed(pid, uid);
- android::captureHotwordAllowed(opPackageName, pid, uid);
- android::modifyPhoneStateAllowed(uid, pid);
- android::bypassInterruptionPolicyAllowed(uid, pid);
+ android::recordingAllowed(identity);
+ android::startRecording(identity, msgStr16, source);
+ android::finishRecording(identity, source);
+ android::captureAudioOutputAllowed(identity);
+ android::captureMediaOutputAllowed(identity);
+ android::captureHotwordAllowed(identity);
+ android::modifyPhoneStateAllowed(identity);
+ android::bypassInterruptionPolicyAllowed(identity);
android::settingsAllowed();
android::modifyAudioRoutingAllowed();
android::modifyDefaultAudioEffectsAllowed();
diff --git a/media/utils/include/mediautils/ServiceUtilities.h b/media/utils/include/mediautils/ServiceUtilities.h
index 03965db..9a3c6fb 100644
--- a/media/utils/include/mediautils/ServiceUtilities.h
+++ b/media/utils/include/mediautils/ServiceUtilities.h
@@ -25,6 +25,7 @@
#include <cutils/multiuser.h>
#include <private/android_filesystem_config.h>
#include <system/audio-hal-enums.h>
+#include <android/media/permission/Identity.h>
#include <map>
#include <optional>
@@ -79,22 +80,25 @@
}
}
-bool recordingAllowed(const String16& opPackageName, pid_t pid, uid_t uid);
-bool startRecording(const String16& opPackageName, pid_t pid, uid_t uid, audio_source_t source);
-void finishRecording(const String16& opPackageName, uid_t uid, audio_source_t source);
-bool captureAudioOutputAllowed(pid_t pid, uid_t uid);
-bool captureMediaOutputAllowed(pid_t pid, uid_t uid);
-bool captureTunerAudioInputAllowed(pid_t pid, uid_t uid);
-bool captureVoiceCommunicationOutputAllowed(pid_t pid, uid_t uid);
-bool captureHotwordAllowed(const String16& opPackageName, pid_t pid, uid_t uid);
+bool recordingAllowed(const media::permission::Identity& identity);
+bool startRecording(const media::permission::Identity& identity,
+ const String16& msg, audio_source_t source);
+void finishRecording(const media::permission::Identity& identity, audio_source_t source);
+bool captureAudioOutputAllowed(const media::permission::Identity& identity);
+bool captureMediaOutputAllowed(const media::permission::Identity& identity);
+bool captureTunerAudioInputAllowed(const media::permission::Identity& identity);
+bool captureVoiceCommunicationOutputAllowed(const media::permission::Identity& identity);
+bool captureHotwordAllowed(const media::permission::Identity& identity);
bool settingsAllowed();
bool modifyAudioRoutingAllowed();
-bool modifyAudioRoutingAllowed(pid_t pid, uid_t uid);
+bool modifyAudioRoutingAllowed(const media::permission::Identity& identity);
bool modifyDefaultAudioEffectsAllowed();
-bool modifyDefaultAudioEffectsAllowed(pid_t pid, uid_t uid);
+bool modifyDefaultAudioEffectsAllowed(const media::permission::Identity& identity);
bool dumpAllowed();
-bool modifyPhoneStateAllowed(pid_t pid, uid_t uid);
-bool bypassInterruptionPolicyAllowed(pid_t pid, uid_t uid);
+bool modifyPhoneStateAllowed(const media::permission::Identity& identity);
+bool bypassInterruptionPolicyAllowed(const media::permission::Identity& identity);
+
+media::permission::Identity getCallingIdentity();
status_t checkIMemory(const sp<IMemory>& iMemory);