From 7549241c158c7a8333d1bba7e858eee64ffa0210 Mon Sep 17 00:00:00 2001 From: kongchenrui Date: Fri, 23 Sep 2022 10:06:30 +0800 Subject: [PATCH] Fix the problem that the data field of Entry in the verifyLogicalOrUltraHighResCameraMetadata function is empty The reason for this problem is: local variables are used when saving PhysicalCameraCharacteristics. When its life cycle ends, physChars will be released. Since Entry uses a pointer, data will be null. So physChars should be defined outside else to ensure that physChars is not released during use Bug: 248221707 Test: VtsHalCameraProviderV2_4TargetTest Test: VtsAidlHalCameraProvider_TargetTest Signed-off-by: kongchenrui Change-Id: I4c05e695d255f210f310f8ce78ec2fa71a42cee9 --- .../functional/VtsHalCameraProviderV2_4TargetTest.cpp | 11 ++++++++--- camera/provider/aidl/vts/camera_aidl_test.cpp | 7 +++---- 2 files changed, 11 insertions(+), 7 deletions(-) diff --git a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp index 6866776ba5..b0ae20eae2 100644 --- a/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp +++ b/camera/provider/2.4/vts/functional/VtsHalCameraProviderV2_4TargetTest.cpp @@ -7883,6 +7883,7 @@ void CameraHidlTest::verifyLogicalOrUltraHighResCameraMetadata( } } + camera_metadata_t* staticMetadata; camera_metadata_ro_entry physicalMultiResStreamConfigs; camera_metadata_ro_entry physicalStreamConfigs; camera_metadata_ro_entry physicalMaxResolutionStreamConfigs; @@ -7901,8 +7902,9 @@ void CameraHidlTest::verifyLogicalOrUltraHighResCameraMetadata( ret = subDevice->getCameraCharacteristics([&](auto status, const auto& chars) { ASSERT_EQ(Status::OK, status); - const camera_metadata_t* staticMetadata = - reinterpret_cast(chars.data()); + staticMetadata = clone_camera_metadata( + reinterpret_cast(chars.data())); + ASSERT_NE(nullptr, staticMetadata); rc = getSystemCameraKind(staticMetadata, &physSystemCameraKind); ASSERT_EQ(rc, Status::OK); // Make sure that the system camera kind of a non-hidden @@ -7936,7 +7938,9 @@ void CameraHidlTest::verifyLogicalOrUltraHighResCameraMetadata( verifyCameraCharacteristics(status, chars); verifyMonochromeCharacteristics(chars, deviceVersion); - auto staticMetadata = (const camera_metadata_t*)chars.data(); + staticMetadata = clone_camera_metadata( + reinterpret_cast(chars.data())); + ASSERT_NE(nullptr, staticMetadata); retcode = find_camera_metadata_ro_entry( staticMetadata, ANDROID_CONTROL_ZOOM_RATIO_RANGE, &entry); bool subCameraHasZoomRatioRange = (0 == retcode && entry.count == 2); @@ -8064,6 +8068,7 @@ void CameraHidlTest::verifyLogicalOrUltraHighResCameraMetadata( } } } + free_camera_metadata(staticMetadata); } // If a multi-resolution stream is supported, there must be at least one diff --git a/camera/provider/aidl/vts/camera_aidl_test.cpp b/camera/provider/aidl/vts/camera_aidl_test.cpp index 20f32bfe21..2c2f1b2c66 100644 --- a/camera/provider/aidl/vts/camera_aidl_test.cpp +++ b/camera/provider/aidl/vts/camera_aidl_test.cpp @@ -1181,6 +1181,7 @@ void CameraAidlTest::verifyLogicalOrUltraHighResCameraMetadata( camera_metadata_ro_entry physicalMultiResStreamConfigs; camera_metadata_ro_entry physicalStreamConfigs; camera_metadata_ro_entry physicalMaxResolutionStreamConfigs; + CameraMetadata physChars; bool isUltraHighRes = false; std::unordered_set subCameraPrivacyTestPatterns; if (isPublicId) { @@ -1189,12 +1190,11 @@ void CameraAidlTest::verifyLogicalOrUltraHighResCameraMetadata( ASSERT_TRUE(ret.isOk()); ASSERT_NE(subDevice, nullptr); - CameraMetadata subDeviceChars; - ret = subDevice->getCameraCharacteristics(&subDeviceChars); + ret = subDevice->getCameraCharacteristics(&physChars); ASSERT_TRUE(ret.isOk()); const camera_metadata_t* staticMetadata = - reinterpret_cast(subDeviceChars.metadata.data()); + reinterpret_cast(physChars.metadata.data()); retStatus = getSystemCameraKind(staticMetadata, &physSystemCameraKind); ASSERT_EQ(retStatus, Status::OK); @@ -1215,7 +1215,6 @@ void CameraAidlTest::verifyLogicalOrUltraHighResCameraMetadata( getPrivacyTestPatternModes(staticMetadata, &subCameraPrivacyTestPatterns); } else { // Check camera characteristics for hidden camera id - CameraMetadata physChars; ndk::ScopedAStatus ret = device->getPhysicalCameraCharacteristics(physicalId, &physChars); ASSERT_TRUE(ret.isOk());