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

Commit ecf17e82 authored by Igor Murashkin's avatar Igor Murashkin Committed by Android (Google) Code Review
Browse files

Camera2: Handle client processes dying by closing camera resources

CameraService now subscribes to binder death notifications
for each client, and disconnects the client if the death happened
without cleanly shutting down the client first.

Bug: 7258314
Change-Id: I7803836b589fd8f0dfe00f6c28a707b82012e751
parent 22d58d37
Loading
Loading
Loading
Loading
+14 −6
Original line number Diff line number Diff line
@@ -47,9 +47,10 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,
        const sp<ICameraClient>& cameraClient,
        int cameraId,
        int cameraFacing,
        int clientPid):
        int clientPid,
        int servicePid):
        Client(cameraService, cameraClient,
                cameraId, cameraFacing, clientPid),
                cameraId, cameraFacing, clientPid, servicePid),
        mSharedCameraClient(cameraClient),
        mParameters(cameraId, cameraFacing)
{
@@ -64,10 +65,10 @@ Camera2Client::Camera2Client(const sp<CameraService>& cameraService,

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

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

@@ -138,8 +139,15 @@ 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);
    if (l.mParameters.state != Parameters::DISCONNECTED) {
        state = l.mParameters.state;
    }

    if (state != Parameters::DISCONNECTED) {
        // Rewrite mClientPid to allow shutdown by CameraService
        mClientPid = getCallingPid();
        disconnect();
+2 −1
Original line number Diff line number Diff line
@@ -74,7 +74,8 @@ public:
            const sp<ICameraClient>& cameraClient,
            int cameraId,
            int cameraFacing,
            int clientPid);
            int clientPid,
            int servicePid);
    virtual ~Camera2Client();

    status_t initialize(camera_module_t *module);
+1 −0
Original line number Diff line number Diff line
@@ -42,6 +42,7 @@ Camera2Device::Camera2Device(int id):
Camera2Device::~Camera2Device()
{
    ATRACE_CALL();
    ALOGV("%s: Tearing down for camera id %d", __FUNCTION__, mId);
    disconnect();
}

+3 −3
Original line number Diff line number Diff line
@@ -40,9 +40,9 @@ static int getCallingUid() {

CameraClient::CameraClient(const sp<CameraService>& cameraService,
        const sp<ICameraClient>& cameraClient,
        int cameraId, int cameraFacing, int clientPid):
        int cameraId, int cameraFacing, int clientPid, int servicePid):
        Client(cameraService, cameraClient,
                cameraId, cameraFacing, clientPid)
                cameraId, cameraFacing, clientPid, servicePid)
{
    int callingPid = getCallingPid();
    LOG1("CameraClient::CameraClient E (pid %d, id %d)", callingPid, cameraId);
@@ -124,7 +124,7 @@ status_t CameraClient::dump(int fd, const Vector<String16>& args) {

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

    ALOGW("attempt to use a locked camera from a different process"
         " (old pid %d, new pid %d)", mClientPid, callingPid);
+2 −1
Original line number Diff line number Diff line
@@ -55,7 +55,8 @@ public:
            const sp<ICameraClient>& cameraClient,
            int cameraId,
            int cameraFacing,
            int clientPid);
            int clientPid,
            int servicePid);
    ~CameraClient();

    status_t initialize(camera_module_t *module);
Loading