Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a71f8a2a authored by TreeHugger Robot's avatar TreeHugger Robot Committed by Android (Google) Code Review
Browse files

Merge "transcoding: use NDK methods for permission and binder"

parents 70b06e03 efeabbd9
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -60,6 +60,7 @@ cc_library_shared {
    ],

    shared_libs: [
        "libandroid",
        "libbinder_ndk",
        "libcutils",
        "liblog",
+15 −24
Original line number Diff line number Diff line
@@ -20,6 +20,7 @@
#include <aidl/android/media/BnTranscodingClient.h>
#include <aidl/android/media/IMediaTranscodingService.h>
#include <android/binder_ibinder.h>
#include <android/permission_manager.h>
#include <inttypes.h>
#include <media/TranscodingClientManager.h>
#include <media/TranscodingRequest.h>
@@ -27,15 +28,11 @@
#include <private/android_filesystem_config.h>
#include <utils/Log.h>
#include <utils/String16.h>

namespace android {

static_assert(sizeof(ClientIdType) == sizeof(void*), "ClientIdType should be pointer-sized");

static constexpr const char* MEDIA_PROVIDER_PKG_NAMES[] = {
        "com.android.providers.media.module",
        "com.google.android.providers.media.module",
};

using ::aidl::android::media::BnTranscodingClient;
using ::aidl::android::media::IMediaTranscodingService;  // For service error codes
using ::aidl::android::media::TranscodingRequestParcel;
@@ -137,7 +134,7 @@ Status TranscodingClientManager::ClientImpl::submitRequest(
        in_clientUid = callingUid;
    } else if (in_clientUid < 0) {
        return Status::ok();
    } else if (in_clientUid != callingUid && !owner->isTrustedCallingUid(callingUid)) {
    } else if (in_clientUid != callingUid && !owner->isTrustedCaller(callingPid, callingUid)) {
        ALOGE("MediaTranscodingService::registerClient rejected (clientPid %d, clientUid %d) "
              "(don't trust callingUid %d)",
              in_clientPid, in_clientUid, callingUid);
@@ -154,7 +151,7 @@ Status TranscodingClientManager::ClientImpl::submitRequest(
        in_clientPid = callingPid;
    } else if (in_clientPid < 0) {
        return Status::ok();
    } else if (in_clientPid != callingPid && !owner->isTrustedCallingUid(callingUid)) {
    } else if (in_clientPid != callingPid && !owner->isTrustedCaller(callingPid, callingUid)) {
        ALOGE("MediaTranscodingService::registerClient rejected (clientPid %d, clientUid %d) "
              "(don't trust callingUid %d)",
              in_clientPid, in_clientUid, callingUid);
@@ -266,14 +263,8 @@ TranscodingClientManager::TranscodingClientManager(
      : mDeathRecipient(AIBinder_DeathRecipient_new(BinderDiedCallback)),
        mSessionController(controller) {
    ALOGD("TranscodingClientManager started");
    uid_t mpuid;
    for (const char* pkgName : MEDIA_PROVIDER_PKG_NAMES) {
        if (TranscodingUidPolicy::getUidForPackage(String16(pkgName), mpuid) == NO_ERROR) {
            ALOGI("Found %s's uid: %d", pkgName, mpuid);
            mMediaProviderUid.insert(mpuid);
        } else {
            ALOGW("Couldn't get uid for %s.", pkgName);
        }
    for (uid_t uid : {AID_ROOT, AID_SYSTEM, AID_SHELL, AID_MEDIA}) {
        mTrustedUids.insert(uid);
    }
}

@@ -305,20 +296,20 @@ void TranscodingClientManager::dumpAllClients(int fd, const Vector<String16>& ar
    write(fd, result.string(), result.size());
}

bool TranscodingClientManager::isTrustedCallingUid(uid_t uid) {
    if (uid > 0 && mMediaProviderUid.count(uid) > 0) {
bool TranscodingClientManager::isTrustedCaller(pid_t pid, uid_t uid) {
    if (uid > 0 && mTrustedUids.count(uid) > 0) {
        return true;
    }

    switch (uid) {
    case AID_ROOT:  // root user
    case AID_SYSTEM:
    case AID_SHELL:
    case AID_MEDIA:  // mediaserver
    int32_t result;
    if (APermissionManager_checkPermission("android.permission.MANAGE_EXTERNAL_STORAGE", pid, uid,
                                           &result) == PERMISSION_MANAGER_STATUS_OK &&
        result == PERMISSION_MANAGER_PERMISSION_GRANTED) {
        mTrustedUids.insert(uid);
        return true;
    default:
        return false;
    }

    return false;
}

status_t TranscodingClientManager::addClient(
+0 −16
Original line number Diff line number Diff line
@@ -21,10 +21,7 @@
#include <aidl/android/media/IResourceManagerService.h>
#include <android/binder_manager.h>
#include <android/binder_process.h>
#include <android/content/pm/IPackageManagerNative.h>
#include <binder/ActivityManager.h>
#include <binder/IServiceManager.h>
#include <binder/PermissionController.h>
#include <cutils/misc.h>  // FIRST_APPLICATION_UID
#include <cutils/multiuser.h>
#include <inttypes.h>
@@ -113,19 +110,6 @@ void TranscodingUidPolicy::UidObserver::binderDied(const wp<IBinder>& /*who*/) {

////////////////////////////////////////////////////////////////////////////

//static
status_t TranscodingUidPolicy::getUidForPackage(String16 packageName, /*inout*/ uid_t& uid) {
    PermissionController pc;
    uid = pc.getPackageUid(packageName, 0);
    if (uid <= 0) {
        ALOGE("Unknown package: '%s'", String8(packageName).string());
        return BAD_VALUE;
    }

    uid = multiuser_get_uid(0 /*userId*/, uid);
    return NO_ERROR;
}

TranscodingUidPolicy::TranscodingUidPolicy()
      : mAm(std::make_shared<ActivityManager>()),
        mUidObserver(new UidObserver(this)),
+2 −2
Original line number Diff line number Diff line
@@ -87,7 +87,7 @@ private:
    TranscodingClientManager(const std::shared_ptr<ControllerClientInterface>& controller);

    // Checks if a user is trusted (and allowed to submit sessions on behalf of other uids)
    bool isTrustedCallingUid(uid_t uid);
    bool isTrustedCaller(pid_t pid, uid_t uid);

    /**
     * Removes an existing client from the manager.
@@ -109,7 +109,7 @@ private:
    ::ndk::ScopedAIBinder_DeathRecipient mDeathRecipient;

    std::shared_ptr<ControllerClientInterface> mSessionController;
    std::unordered_set<uid_t> mMediaProviderUid;
    std::unordered_set<uid_t> mTrustedUids;

    static std::atomic<ClientIdType> sCookieCounter;
    static std::mutex sCookie2ClientLock;
+0 −2
Original line number Diff line number Diff line
@@ -49,8 +49,6 @@ public:
    void setCallback(const std::shared_ptr<UidPolicyCallbackInterface>& cb) override;
    // ~UidPolicyInterface

    static status_t getUidForPackage(String16 packageName, /*inout*/ uid_t& uid);

private:
    void onUidStateChanged(uid_t uid, int32_t procState);
    void setUidObserverRegistered(bool registerd);
Loading