Merge tag 'android-security-11.0.0_r49' into int/11/fp3

Android security 11.0.0 release 49

* tag 'android-security-11.0.0_r49':
  Use strong pointer in ALooper to avoid use-after-free
  Ensure looper isn't used after invalidateSensorQueue

Change-Id: I5b4146fdfad043ab4b6ae32854c69ad7e545ebce
diff --git a/cameraservice/vts/functional/VtsHalCameraServiceV2_0TargetTest.cpp b/cameraservice/vts/functional/VtsHalCameraServiceV2_0TargetTest.cpp
index 8c814d4..3ca7d75 100644
--- a/cameraservice/vts/functional/VtsHalCameraServiceV2_0TargetTest.cpp
+++ b/cameraservice/vts/functional/VtsHalCameraServiceV2_0TargetTest.cpp
@@ -334,10 +334,22 @@
         return false;
     }
 
-    // Return the first advertised available depth stream sizes
-    StreamConfiguration getDepthStreamConfiguration(const CameraMetadata& characteristics) {
+    bool isSecureOnlyDevice(const CameraMetadata& characteristics) {
         camera_metadata_ro_entry rawEntry =
-            characteristics.find(ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS);
+            characteristics.find(ANDROID_REQUEST_AVAILABLE_CAPABILITIES);
+        EXPECT_TRUE(rawEntry.count > 0);
+        if (rawEntry.count == 1 &&
+            rawEntry.data.u8[0] == ANDROID_REQUEST_AVAILABLE_CAPABILITIES_SECURE_IMAGE_DATA) {
+            return true;
+        }
+        return false;
+    }
+
+    // Return the first advertised available stream sizes for the given format
+    // and use-case.
+    StreamConfiguration getStreamConfiguration(const CameraMetadata& characteristics, uint32_t tag,
+                                               int32_t chosenUse, int32_t chosenFormat) {
+        camera_metadata_ro_entry rawEntry = characteristics.find(tag);
         StreamConfiguration streamConfig;
         const size_t STREAM_FORMAT_OFFSET = 0;
         const size_t STREAM_WIDTH_OFFSET = 1;
@@ -351,8 +363,7 @@
         for (size_t i = 0; i < rawEntry.count; i += STREAM_CONFIG_SIZE) {
             int32_t format = rawEntry.data.i32[i + STREAM_FORMAT_OFFSET];
             int32_t use = rawEntry.data.i32[i + STREAM_INOUT_OFFSET];
-            if (format == HAL_PIXEL_FORMAT_Y16 &&
-                use == ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT) {
+            if (format == chosenFormat && use == chosenUse) {
                 streamConfig.width = rawEntry.data.i32[i + STREAM_WIDTH_OFFSET];
                 streamConfig.height = rawEntry.data.i32[i + STREAM_HEIGHT_OFFSET];
                 return streamConfig;
@@ -413,17 +424,38 @@
         int chosenImageFormat = AIMAGE_FORMAT_YUV_420_888;
         int chosenImageWidth = kVGAImageWidth;
         int chosenImageHeight = kVGAImageHeight;
-        if (isDepthOnlyDevice) {
-            StreamConfiguration depthStreamConfig = getDepthStreamConfiguration(rawMetadata);
-            EXPECT_TRUE(depthStreamConfig.width != -1);
-            EXPECT_TRUE(depthStreamConfig.height != -1);
-            chosenImageFormat = AIMAGE_FORMAT_DEPTH16;
-            chosenImageWidth = depthStreamConfig.width;
-            chosenImageHeight = depthStreamConfig.height;
+        bool isSecureOnlyCamera = isSecureOnlyDevice(rawMetadata);
+        status_t mStatus = OK;
+        if (isSecureOnlyCamera) {
+            StreamConfiguration secureStreamConfig =
+                getStreamConfiguration(rawMetadata, ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS,
+                                       ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS_OUTPUT,
+                                       HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED);
+            EXPECT_TRUE(secureStreamConfig.width != -1);
+            EXPECT_TRUE(secureStreamConfig.height != -1);
+            chosenImageFormat = AIMAGE_FORMAT_PRIVATE;
+            chosenImageWidth = secureStreamConfig.width;
+            chosenImageHeight = secureStreamConfig.height;
+            mStatus = AImageReader_newWithUsage(
+                chosenImageWidth, chosenImageHeight, chosenImageFormat,
+                AHARDWAREBUFFER_USAGE_PROTECTED_CONTENT, kCaptureRequestCount, &reader);
+
+        } else {
+            if (isDepthOnlyDevice) {
+                StreamConfiguration depthStreamConfig = getStreamConfiguration(
+                    rawMetadata, ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS,
+                    ANDROID_DEPTH_AVAILABLE_DEPTH_STREAM_CONFIGURATIONS_OUTPUT,
+                    HAL_PIXEL_FORMAT_Y16);
+                EXPECT_TRUE(depthStreamConfig.width != -1);
+                EXPECT_TRUE(depthStreamConfig.height != -1);
+                chosenImageFormat = AIMAGE_FORMAT_DEPTH16;
+                chosenImageWidth = depthStreamConfig.width;
+                chosenImageHeight = depthStreamConfig.height;
+            }
+            mStatus = AImageReader_new(chosenImageWidth, chosenImageHeight, chosenImageFormat,
+                                       kCaptureRequestCount, &reader);
         }
 
-        auto mStatus = AImageReader_new(chosenImageWidth, chosenImageHeight, chosenImageFormat,
-                                        kCaptureRequestCount, &reader);
         EXPECT_EQ(mStatus, AMEDIA_OK);
         native_handle_t* wh = nullptr;
         mStatus = AImageReader_getWindowNativeHandle(reader, &wh);