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

Commit 18df60e0 authored by Chien-Yu Chen's avatar Chien-Yu Chen
Browse files

Camera: Use original client PID for eviction

Use the original client PID to evaluate priorities for eviction. The
original client PID may be different from the calling PID when the
application uses MediaRecorder to open camera.

Bug: 26493273
Change-Id: I8f56194f1ca2151701efb8cb380ff4abf6c8d6c4
parent 42f2707b
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -912,7 +912,8 @@ static bool isTrustedCallingUid(uid_t uid) {
}

Status CameraService::validateConnectLocked(const String8& cameraId,
        const String8& clientName8, /*inout*/int& clientUid, /*inout*/int& clientPid) const {
        const String8& clientName8, /*inout*/int& clientUid, /*inout*/int& clientPid,
        /*out*/int& originalClientPid) const {

    int callingPid = getCallingPid();
    int callingUid = getCallingUid();
@@ -954,6 +955,7 @@ Status CameraService::validateConnectLocked(const String8& cameraId,

    // Only use passed in clientPid to check permission. Use calling PID as the client PID that's
    // connected to camera service directly.
    originalClientPid = clientPid;
    clientPid = callingPid;

    if (!mModule) {
+11 −3
Original line number Diff line number Diff line
@@ -488,8 +488,14 @@ private:
    virtual void onFirstRef();

    // Check if we can connect, before we acquire the service lock.
    // The returned originalClientPid is the PID of the original process that wants to connect to
    // camera.
    // The returned clientPid is the PID of the client that directly connects to camera.
    // originalClientPid and clientPid are usually the same except when the application uses
    // mediaserver to connect to camera (using MediaRecorder to connect to camera). In that case,
    // clientPid is the PID of mediaserver and originalClientPid is the PID of the application.
    binder::Status validateConnectLocked(const String8& cameraId, const String8& clientName8,
          /*inout*/int& clientUid, /*inout*/int& clientPid) const;
          /*inout*/int& clientUid, /*inout*/int& clientPid, /*out*/int& originalClientPid) const;

    // Handle active client evictions, and update service state.
    // Only call with with mServiceLock held.
@@ -819,6 +825,8 @@ binder::Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const

    String8 clientName8(clientPackageName);

    int originalClientPid = 0;

    ALOGI("CameraService::connect call (PID %d \"%s\", camera ID %s) for HAL version %s and "
            "Camera API version %d", clientPid, clientName8.string(), cameraId.string(),
            (halVersion == -1) ? "default" : std::to_string(halVersion).c_str(),
@@ -840,7 +848,7 @@ binder::Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const

        // Enforce client permissions and do basic sanity checks
        if(!(ret = validateConnectLocked(cameraId, clientName8,
                /*inout*/clientUid, /*inout*/clientPid)).isOk()) {
                /*inout*/clientUid, /*inout*/clientPid, /*out*/originalClientPid)).isOk()) {
            return ret;
        }

@@ -857,7 +865,7 @@ binder::Status CameraService::connectHelper(const sp<CALLBACK>& cameraCb, const

        sp<BasicClient> clientTmp = nullptr;
        std::shared_ptr<resource_policy::ClientDescriptor<String8, sp<BasicClient>>> partial;
        if ((err = handleEvictionsLocked(cameraId, clientPid, effectiveApiLevel,
        if ((err = handleEvictionsLocked(cameraId, originalClientPid, effectiveApiLevel,
                IInterface::asBinder(cameraCb), clientName8, /*out*/&clientTmp,
                /*out*/&partial)) != NO_ERROR) {
            switch (err) {