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

Commit 6dc9b53a authored by Yin-Chia Yeh's avatar Yin-Chia Yeh
Browse files

Camera: fix open_legacy crash

If the torch callback is fired during CameraProvider
constructor, the sp will cause it being deleted
when the callback returns.

Test: fix the crash
Bug: 35216523
Change-Id: I133d866ed603d6c7e549b57d20a911af7a7e0698
parent de85b24b
Loading
Loading
Loading
Loading
+4 −8
Original line number Diff line number Diff line
@@ -51,8 +51,7 @@ void CameraProvider::sCameraDeviceStatusChange(
        const struct camera_module_callbacks* callbacks,
        int camera_id,
        int new_status) {
    ALOGI("%s++", __FUNCTION__);
    sp<CameraProvider> cp = const_cast<CameraProvider*>(
    CameraProvider* cp = const_cast<CameraProvider*>(
            static_cast<const CameraProvider*>(callbacks));

    if (cp == nullptr) {
@@ -60,7 +59,7 @@ void CameraProvider::sCameraDeviceStatusChange(
        return;
    }

    ALOGI("%s resolved provider %p", __FUNCTION__, cp.get());
    ALOGI("%s resolved provider %p", __FUNCTION__, cp);

    Mutex::Autolock _l(cp->mCbLock);
    char cameraId[kMaxCameraIdLen];
@@ -76,15 +75,13 @@ void CameraProvider::sCameraDeviceStatusChange(
            }
        }
    }
    ALOGI("%s--", __FUNCTION__);
}

void CameraProvider::sTorchModeStatusChange(
        const struct camera_module_callbacks* callbacks,
        const char* camera_id,
        int new_status) {
    ALOGI("%s++", __FUNCTION__);
    sp<CameraProvider> cp = const_cast<CameraProvider*>(
    CameraProvider* cp = const_cast<CameraProvider*>(
            static_cast<const CameraProvider*>(callbacks));

    if (cp == nullptr) {
@@ -92,7 +89,7 @@ void CameraProvider::sTorchModeStatusChange(
        return;
    }

    ALOGI("%s resolved provider %p", __FUNCTION__, cp.get());
    ALOGI("%s resolved provider %p", __FUNCTION__, cp);

    Mutex::Autolock _l(cp->mCbLock);
    if (cp->mCallbacks != nullptr) {
@@ -105,7 +102,6 @@ void CameraProvider::sTorchModeStatusChange(
            }
        }
    }
    ALOGI("%s--", __FUNCTION__);
}

Status CameraProvider::getHidlStatus(int status) {