From 796804387e39ddb35a63b747759dac955683809e Mon Sep 17 00:00:00 2001 From: Shuzhen Wang Date: Thu, 5 Mar 2020 11:53:46 -0800 Subject: [PATCH] Camera: Fix ProviderInfo leak Having a sp in DeviceInfo resulting in the parent ProviderInfo not being deallocated. Test: Check camera characteristics object freed by killing provider Bug: 149813446 Change-Id: Ic15ffcd3a5ce424187877e17a14b4db581e2c50a --- .../common/CameraProviderManager.cpp | 26 ++++++++++++++----- .../common/CameraProviderManager.h | 2 +- 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/services/camera/libcameraservice/common/CameraProviderManager.cpp b/services/camera/libcameraservice/common/CameraProviderManager.cpp index 2c97a383ec..0fd89f1a64 100644 --- a/services/camera/libcameraservice/common/CameraProviderManager.cpp +++ b/services/camera/libcameraservice/common/CameraProviderManager.cpp @@ -326,8 +326,11 @@ status_t CameraProviderManager::setTorchMode(const std::string &id, bool enabled // Pass the camera ID to start interface so that it will save it to the map of ICameraProviders // that are currently in use. - const sp interface = - deviceInfo->mParentProvider->startProviderInterface(); + sp parentProvider = deviceInfo->mParentProvider.promote(); + if (parentProvider == nullptr) { + return DEAD_OBJECT; + } + const sp interface = parentProvider->startProviderInterface(); if (interface == nullptr) { return DEAD_OBJECT; } @@ -380,8 +383,11 @@ status_t CameraProviderManager::openSession(const std::string &id, if (deviceInfo == nullptr) return NAME_NOT_FOUND; auto *deviceInfo3 = static_cast(deviceInfo); - const sp provider = - deviceInfo->mParentProvider->startProviderInterface(); + sp parentProvider = deviceInfo->mParentProvider.promote(); + if (parentProvider == nullptr) { + return DEAD_OBJECT; + } + const sp provider = parentProvider->startProviderInterface(); if (provider == nullptr) { return DEAD_OBJECT; } @@ -423,8 +429,11 @@ status_t CameraProviderManager::openSession(const std::string &id, if (deviceInfo == nullptr) return NAME_NOT_FOUND; auto *deviceInfo1 = static_cast(deviceInfo); - const sp provider = - deviceInfo->mParentProvider->startProviderInterface(); + sp parentProvider = deviceInfo->mParentProvider.promote(); + if (parentProvider == nullptr) { + return DEAD_OBJECT; + } + const sp provider = parentProvider->startProviderInterface(); if (provider == nullptr) { return DEAD_OBJECT; } @@ -2044,7 +2053,10 @@ sp CameraProviderManager::ProviderInfo::DeviceInfo::startDeviceInter sp device; ATRACE_CALL(); if (mSavedInterface == nullptr) { - device = mParentProvider->startDeviceInterface(mName); + sp parentProvider = mParentProvider.promote(); + if (parentProvider != nullptr) { + device = parentProvider->startDeviceInterface(mName); + } } else { device = (InterfaceT *) mSavedInterface.get(); } diff --git a/services/camera/libcameraservice/common/CameraProviderManager.h b/services/camera/libcameraservice/common/CameraProviderManager.h index 1a0298018d..5359c39a52 100644 --- a/services/camera/libcameraservice/common/CameraProviderManager.h +++ b/services/camera/libcameraservice/common/CameraProviderManager.h @@ -447,7 +447,7 @@ private: std::map mPhysicalStatus; - sp mParentProvider; + wp mParentProvider; bool hasFlashUnit() const { return mHasFlashUnit; } bool supportNativeZoomRatio() const { return mSupportNativeZoomRatio; }