From 81047b9b378adca87a75389e4e3da86caf9bd81f Mon Sep 17 00:00:00 2001 From: Jeroen Weener Date: Mon, 15 May 2023 15:47:25 +0200 Subject: [PATCH 1/3] Catch `SecurityException` in `getPathFromUri()` --- packages/image_picker/image_picker_android/CHANGELOG.md | 4 ++++ .../java/io/flutter/plugins/imagepicker/FileUtils.java | 7 +++++++ packages/image_picker/image_picker_android/pubspec.yaml | 2 +- 3 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_android/CHANGELOG.md b/packages/image_picker/image_picker_android/CHANGELOG.md index f7d0b4008590..385700b3d47b 100644 --- a/packages/image_picker/image_picker_android/CHANGELOG.md +++ b/packages/image_picker/image_picker_android/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.8.6+16 + +* Fixes crashes caused by `SecurityException` when calling `getPathFromUri()`. + ## 0.8.6+15 * Bumps androidx.activity:activity from 1.6.1 to 1.7.0. diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java index 4ca970a3344a..0bd89a3e2e8f 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java @@ -79,6 +79,13 @@ String getPathFromUri(final Context context, final Uri uri) { // target file was written in full. Flushing the stream merely moves // the bytes into the OS, not necessarily to the file. return null; + } catch (SecurityException e) { + // Calling `ContentResolver#openInputStream()` has been reported to throw a + // `SecurityException` on some devices in certain circumstances. Instead of crashing, we + // return `null`. + // + // See [this issue](https://github.com/flutter/flutter/issues/100025) for more details. + return null; } } diff --git a/packages/image_picker/image_picker_android/pubspec.yaml b/packages/image_picker/image_picker_android/pubspec.yaml index 091212f0ada9..0ee39768d7c8 100755 --- a/packages/image_picker/image_picker_android/pubspec.yaml +++ b/packages/image_picker/image_picker_android/pubspec.yaml @@ -3,7 +3,7 @@ description: Android implementation of the image_picker plugin. repository: https://github.com/flutter/packages/tree/main/packages/image_picker/image_picker_android issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+image_picker%22 -version: 0.8.6+15 +version: 0.8.6+16 environment: sdk: ">=2.18.0 <4.0.0" From f4e47933e0c510aeb1a2456a94d5c7e7c861a673 Mon Sep 17 00:00:00 2001 From: Jeroen Weener Date: Tue, 16 May 2023 10:18:27 +0200 Subject: [PATCH 2/3] Add `SecurityException` unit test --- .../plugins/imagepicker/FileUtilTest.java | 23 ++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/FileUtilTest.java b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/FileUtilTest.java index d125b78150cc..06315f99f990 100644 --- a/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/FileUtilTest.java +++ b/packages/image_picker/image_picker_android/android/src/test/java/io/flutter/plugins/imagepicker/FileUtilTest.java @@ -5,10 +5,16 @@ package io.flutter.plugins.imagepicker; import static java.nio.charset.StandardCharsets.UTF_8; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; import static org.robolectric.Shadows.shadowOf; import android.content.ContentProvider; +import android.content.ContentResolver; import android.content.ContentValues; import android.content.Context; import android.database.Cursor; @@ -66,7 +72,22 @@ public void FileUtil_GetPathFromUri() throws IOException { assertTrue(bytes.length > 0); String imageStream = new String(bytes, UTF_8); - assertTrue(imageStream.equals("imageStream")); + assertEquals("imageStream", imageStream); + } + + @Test + public void FileUtil_GetPathFromUri_securityException() throws IOException { + Uri uri = Uri.parse("content://dummy/dummy.png"); + + ContentResolver mockContentResolver = mock(ContentResolver.class); + when(mockContentResolver.openInputStream(any(Uri.class))).thenThrow(SecurityException.class); + + Context mockContext = mock(Context.class); + when(mockContext.getContentResolver()).thenReturn(mockContentResolver); + + String path = fileUtils.getPathFromUri(mockContext, uri); + + assertNull(path); } @Test From 44afbb485551e7a65e029d818cbc906d911dfa37 Mon Sep 17 00:00:00 2001 From: Jeroen Weener Date: Wed, 17 May 2023 10:47:18 +0200 Subject: [PATCH 3/3] Omit markdown for url --- .../src/main/java/io/flutter/plugins/imagepicker/FileUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java index 0bd89a3e2e8f..df229d8cefbf 100644 --- a/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java +++ b/packages/image_picker/image_picker_android/android/src/main/java/io/flutter/plugins/imagepicker/FileUtils.java @@ -84,7 +84,7 @@ String getPathFromUri(final Context context, final Uri uri) { // `SecurityException` on some devices in certain circumstances. Instead of crashing, we // return `null`. // - // See [this issue](https://github.com/flutter/flutter/issues/100025) for more details. + // See https://github.com/flutter/flutter/issues/100025 for more details. return null; } }