Fix crash when virtual camera is unregistered during active session.
Store weak_ptr to VirtualCameraDevice instance in VirtualCameraSession
to detect when the camera was removed as well as to make sure
it's not destroyed when VirtualCameraSession accesses
VirtualCameraDevice.
Bug: 301023410
Test: atest VirtualCameraTest (not closing the session)
Test: atest virtual_camera_tests
Change-Id: Ie87c91f6872b9241dddf64f1a4f1991eb54d3cda
diff --git a/services/camera/virtualcamera/VirtualCameraSession.cc b/services/camera/virtualcamera/VirtualCameraSession.cc
index 9e15871..47780d8 100644
--- a/services/camera/virtualcamera/VirtualCameraSession.cc
+++ b/services/camera/virtualcamera/VirtualCameraSession.cc
@@ -153,7 +153,7 @@
} // namespace
VirtualCameraSession::VirtualCameraSession(
- VirtualCameraDevice& cameraDevice,
+ std::shared_ptr<VirtualCameraDevice> cameraDevice,
std::shared_ptr<ICameraDeviceCallback> cameraDeviceCallback,
std::shared_ptr<IVirtualCameraCallback> virtualCameraClientCallback)
: mCameraDevice(cameraDevice),
@@ -201,6 +201,12 @@
return cameraStatus(Status::ILLEGAL_ARGUMENT);
}
+ std::shared_ptr<VirtualCameraDevice> virtualCamera = mCameraDevice.lock();
+ if (virtualCamera == nullptr) {
+ ALOGW("%s: configure called on already unregistered camera", __func__);
+ return cameraStatus(Status::CAMERA_DISCONNECTED);
+ }
+
mSessionContext.removeStreamsNotInStreamConfiguration(
in_requestedConfiguration);
@@ -213,7 +219,7 @@
int inputWidth;
int inputHeight;
- if (!mCameraDevice.isStreamCombinationSupported(in_requestedConfiguration)) {
+ if (!virtualCamera->isStreamCombinationSupported(in_requestedConfiguration)) {
ALOGE("%s: Requested stream configuration is not supported", __func__);
return cameraStatus(Status::ILLEGAL_ARGUMENT);
}