Merge cherrypicks of ['googleplex-android-review.googlesource.com/37751804'] into 24Q3-platform-release.

Change-Id: Iade43ebe12f22062ba057f26ed617780b933f239
diff --git a/core/java/com/android/internal/widget/LocalImageResolver.java b/core/java/com/android/internal/widget/LocalImageResolver.java
index 6351c0e..97e66d9 100644
--- a/core/java/com/android/internal/widget/LocalImageResolver.java
+++ b/core/java/com/android/internal/widget/LocalImageResolver.java
@@ -34,6 +34,7 @@
 import com.android.internal.annotations.VisibleForTesting;
 
 import java.io.IOException;
+import java.util.Locale;
 
 /** A class to extract Drawables from a MessagingStyle/ConversationStyle message. */
 public class LocalImageResolver {
@@ -259,6 +260,28 @@
             int maxWidth, int maxHeight) {
         final Size size = info.getSize();
 
+        final String mimeType = info.getMimeType();
+        boolean isAllowedCodec = false;
+        if (mimeType != null) {
+            switch (mimeType.toLowerCase(Locale.US)) {
+                case "image/png":
+                case "image/jpeg":
+                case "image/webp":
+                case "image/gif":
+                case "image/bmp":
+                case "image/x-ico":
+                case "image/vnd.wap.wbmp":
+                case "image/heif":
+                case "image/heic":
+                case "image/avif":
+                    isAllowedCodec = true;
+                    break;
+            }
+        }
+        if (!isAllowedCodec) {
+            throw new RuntimeException("Image mime type (" + mimeType + ") is not allowed.");
+        }
+
         if (size.getWidth() > DEFAULT_DECODE_HARD_LIMIT_PX
                 || size.getHeight() > DEFAULT_DECODE_HARD_LIMIT_PX) {
             // The image is larger than what we can reasonably expect to decode without filling up
diff --git a/core/tests/coretests/res/raw/dng_opcode_MapTable_ProcessArea.png b/core/tests/coretests/res/raw/dng_opcode_MapTable_ProcessArea.png
new file mode 100644
index 0000000..3003143
--- /dev/null
+++ b/core/tests/coretests/res/raw/dng_opcode_MapTable_ProcessArea.png
Binary files differ
diff --git a/core/tests/coretests/src/com/android/internal/widget/LocalImageResolverTest.java b/core/tests/coretests/src/com/android/internal/widget/LocalImageResolverTest.java
index e2ce346..474e3c3 100644
--- a/core/tests/coretests/src/com/android/internal/widget/LocalImageResolverTest.java
+++ b/core/tests/coretests/src/com/android/internal/widget/LocalImageResolverTest.java
@@ -334,4 +334,12 @@
         Icon icon = Icon.createWithResource("invalid.package", R.drawable.test32x24);
         assertThat(LocalImageResolver.resolveResourcesForIcon(mContext, icon)).isNull();
     }
+
+    @Test(expected = IOException.class)
+    public void resolveImage_asset_invalidMimeType() throws IOException {
+        // dng mimetype is not supported
+        Uri uri = Uri.parse("android.resource://"
+                + mContext.getPackageName() + "/" + R.raw.dng_opcode_MapTable_ProcessArea);
+        LocalImageResolver.resolveImage(uri, mContext);
+    }
 }