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

Commit 50016d7e authored by Eino-Ville Talvala's avatar Eino-Ville Talvala Committed by Android Git Automerger
Browse files

am c0379204: Camera: Limit valid caller PIDs for camera clients.

* commit 'c0379204':
  Camera: Limit valid caller PIDs for camera clients.
parents 3ac9bd7e 61704883
Loading
Loading
Loading
Loading
+8 −16
Original line number Diff line number Diff line
@@ -65,10 +65,10 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,

status_t Camera2Client::checkPid(const char* checkLocation) const {
    int callingPid = getCallingPid();
    if (callingPid == mClientPid || callingPid == mServicePid) return NO_ERROR;
    if (callingPid == mClientPid) return NO_ERROR;

    ALOGE("%s: attempt to use a locked camera from a different process"
            " (old pid %d, new pid %d, servicePid %d)", checkLocation, mClientPid, callingPid, mServicePid);
            " (old pid %d, new pid %d)", checkLocation, mClientPid, callingPid);
    return PERMISSION_DENIED;
}

@@ -139,19 +139,7 @@ Camera2Client::~Camera2Client() {

    mDestructionStarted = true;

    Parameters::State state;
    // warning:
    //   holding on to locks more than necessary may be hazardous to your health
    {
        SharedParameters::Lock l(mParameters);
        state = l.mParameters.state;
    }

    if (state != Parameters::DISCONNECTED) {
        // Rewrite mClientPid to allow shutdown by CameraService
        mClientPid = getCallingPid();
    disconnect();
    }

    ALOGI("Camera %d: Closed", mCameraId);
}
@@ -372,7 +360,10 @@ void Camera2Client::disconnect() {
    ATRACE_CALL();
    Mutex::Autolock icl(mICameraLock);
    status_t res;
    if ( (res = checkPid(__FUNCTION__) ) != OK) return;

    // Allow both client and the media server to disconnect at all times
    int callingPid = getCallingPid();
    if (callingPid != mClientPid && callingPid != mServicePid) return;

    if (mDevice == 0) return;

@@ -382,6 +373,7 @@ void Camera2Client::disconnect() {

    {
        SharedParameters::Lock l(mParameters);
        if (l.mParameters.state == Parameters::DISCONNECTED) return;
        l.mParameters.state = Parameters::DISCONNECTED;
    }

+3 −4
Original line number Diff line number Diff line
@@ -102,8 +102,6 @@ CameraClient::~CameraClient() {
    int callingPid = getCallingPid();
    LOG1("CameraClient::~CameraClient E (pid %d, this %p)", callingPid, this);

    // set mClientPid to let disconnet() tear down the hardware
    mClientPid = callingPid;
    disconnect();
    LOG1("CameraClient::~CameraClient X (pid %d, this %p)", callingPid, this);
}
@@ -125,7 +123,7 @@ status_t CameraClient::dump(int fd, const Vector<String16>& args) {

status_t CameraClient::checkPid() const {
    int callingPid = getCallingPid();
    if (callingPid == mClientPid || callingPid == mServicePid) return NO_ERROR;
    if (callingPid == mClientPid) return NO_ERROR;

    ALOGW("attempt to use a locked camera from a different process"
         " (old pid %d, new pid %d)", mClientPid, callingPid);
@@ -219,7 +217,8 @@ void CameraClient::disconnect() {
    LOG1("disconnect E (pid %d)", callingPid);
    Mutex::Autolock lock(mLock);

    if (checkPid() != NO_ERROR) {
    // Allow both client and the media server to disconnect at all times
    if (callingPid != mClientPid && callingPid != mServicePid) {
        ALOGW("different client - don't disconnect");
        return;
    }