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/VirtualCameraDevice.cc b/services/camera/virtualcamera/VirtualCameraDevice.cc
index ec72ee3..0657d81 100644
--- a/services/camera/virtualcamera/VirtualCameraDevice.cc
+++ b/services/camera/virtualcamera/VirtualCameraDevice.cc
@@ -322,7 +322,7 @@
ALOGV("%s", __func__);
*_aidl_return = ndk::SharedRefBase::make<VirtualCameraSession>(
- *this, in_callback, mVirtualCameraClientCallback);
+ sharedFromThis(), in_callback, mVirtualCameraClientCallback);
return ndk::ScopedAStatus::ok();
};
@@ -367,6 +367,13 @@
return std::string(kDevicePathPrefix) + std::to_string(mCameraId);
}
+std::shared_ptr<VirtualCameraDevice> VirtualCameraDevice::sharedFromThis() {
+ // SharedRefBase which BnCameraDevice inherits from breaks
+ // std::enable_shared_from_this. This is recommended replacement for
+ // shared_from_this() per documentation in binder_interface_utils.h.
+ return ref<VirtualCameraDevice>();
+}
+
} // namespace virtualcamera
} // namespace companion
} // namespace android