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

Commit 25152e4e authored by Shuzhen Wang's avatar Shuzhen Wang
Browse files

Camera: Fix null pointer exception in CameraServiceProxyWrapper

Indexing into the mSessionStatsMap would insert a nullptr.
Check the count for a certain key instead.

In addition, call logStreamConfigured only when the reconfiguration
succeeds.

Test: Vendor test, Camera CTS
Bug: 287120330
Change-Id: I17d715865c9a58d3b79ab0a511a0f4968f0aa3f8
parent 20d86c24
Loading
Loading
Loading
Loading
+3 −3
Original line number Original line Diff line number Diff line
@@ -2365,6 +2365,9 @@ bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams, int c
            //present streams end up with outstanding buffers that will
            //present streams end up with outstanding buffers that will
            //not get drained.
            //not get drained.
            internalUpdateStatusLocked(STATUS_ACTIVE);
            internalUpdateStatusLocked(STATUS_ACTIVE);

            mCameraServiceProxyWrapper->logStreamConfigured(mId, mOperatingMode,
                    true /*internalReconfig*/, ns2ms(systemTime() - startTime));
        } else if (rc == DEAD_OBJECT) {
        } else if (rc == DEAD_OBJECT) {
            // DEAD_OBJECT can be returned if either the consumer surface is
            // DEAD_OBJECT can be returned if either the consumer surface is
            // abandoned, or the HAL has died.
            // abandoned, or the HAL has died.
@@ -2380,9 +2383,6 @@ bool Camera3Device::reconfigureCamera(const CameraMetadata& sessionParams, int c
        ALOGE("%s: Failed to pause streaming: %d", __FUNCTION__, rc);
        ALOGE("%s: Failed to pause streaming: %d", __FUNCTION__, rc);
    }
    }


    mCameraServiceProxyWrapper->logStreamConfigured(mId, mOperatingMode, true /*internalReconfig*/,
        ns2ms(systemTime() - startTime));

    if (markClientActive) {
    if (markClientActive) {
        mStatusTracker->markComponentActive(clientStatusId);
        mStatusTracker->markComponentActive(clientStatusId);
    }
    }
+9 −10
Original line number Original line Diff line number Diff line
@@ -243,12 +243,12 @@ void CameraServiceProxyWrapper::logStreamConfigured(const String8& id,
    std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
    std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
    {
    {
        Mutex::Autolock l(mLock);
        Mutex::Autolock l(mLock);
        sessionStats = mSessionStatsMap[id];
        if (mSessionStatsMap.count(id) == 0) {
        if (sessionStats == nullptr) {
            ALOGE("%s: SessionStatsMap should contain camera %s",
            ALOGE("%s: SessionStatsMap should contain camera %s",
                    __FUNCTION__, id.c_str());
                    __FUNCTION__, id.c_str());
            return;
            return;
        }
        }
        sessionStats = mSessionStatsMap[id];
    }
    }


    ALOGV("%s: id %s, operatingMode %d, internalConfig %d, latencyMs %d",
    ALOGV("%s: id %s, operatingMode %d, internalConfig %d, latencyMs %d",
@@ -260,12 +260,12 @@ void CameraServiceProxyWrapper::logActive(const String8& id, float maxPreviewFps
    std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
    std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
    {
    {
        Mutex::Autolock l(mLock);
        Mutex::Autolock l(mLock);
        sessionStats = mSessionStatsMap[id];
        if (mSessionStatsMap.count(id) == 0) {
        if (sessionStats == nullptr) {
            ALOGE("%s: SessionStatsMap should contain camera %s when logActive is called",
            ALOGE("%s: SessionStatsMap should contain camera %s when logActive is called",
                    __FUNCTION__, id.c_str());
                    __FUNCTION__, id.c_str());
            return;
            return;
        }
        }
        sessionStats = mSessionStatsMap[id];
    }
    }


    ALOGV("%s: id %s", __FUNCTION__, id.c_str());
    ALOGV("%s: id %s", __FUNCTION__, id.c_str());
@@ -280,14 +280,13 @@ void CameraServiceProxyWrapper::logIdle(const String8& id,
    std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
    std::shared_ptr<CameraSessionStatsWrapper> sessionStats;
    {
    {
        Mutex::Autolock l(mLock);
        Mutex::Autolock l(mLock);
        sessionStats = mSessionStatsMap[id];
        if (mSessionStatsMap.count(id) == 0) {
    }

    if (sessionStats == nullptr) {
            ALOGE("%s: SessionStatsMap should contain camera %s when logIdle is called",
            ALOGE("%s: SessionStatsMap should contain camera %s when logIdle is called",
                __FUNCTION__, id.c_str());
                __FUNCTION__, id.c_str());
            return;
            return;
        }
        }
        sessionStats = mSessionStatsMap[id];
    }


    ALOGV("%s: id %s, requestCount %" PRId64 ", resultErrorCount %" PRId64 ", deviceError %d"
    ALOGV("%s: id %s, requestCount %" PRId64 ", resultErrorCount %" PRId64 ", deviceError %d"
            ", userTag %s, videoStabilizationMode %d", __FUNCTION__, id.c_str(), requestCount,
            ", userTag %s, videoStabilizationMode %d", __FUNCTION__, id.c_str(), requestCount,