From 1d09a6708a68c54de02b1ceded588080637a3882 Mon Sep 17 00:00:00 2001 From: Torsten Grote <t@grobox.de> Date: Fri, 14 Dec 2018 20:09:51 -0200 Subject: [PATCH] [android] don't ever load an entire image into memory This happens on API 27+28 if loading TIFF or WebP files. Using an InputStream with a read limit prevents this. --- .../conversation/AttachmentController.java | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java b/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java index ed82c5adff..9285f9a8d3 100644 --- a/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java +++ b/briar-android/src/main/java/org/briarproject/briar/android/conversation/AttachmentController.java @@ -6,6 +6,8 @@ import android.support.annotation.Nullable; import android.support.media.ExifInterface; import android.webkit.MimeTypeMap; +import com.bumptech.glide.util.MarkEnforcingInputStream; + import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DbException; @@ -44,6 +46,7 @@ class AttachmentController { private static final Logger LOG = getLogger(AttachmentController.class.getName()); + private static final int READ_LIMIT = 1024 * 8192; private final MessagingManager messagingManager; private final int defaultSize; @@ -128,8 +131,9 @@ class AttachmentController { } Size size = new Size(); - InputStream is = new BufferedInputStream(a.getStream()); - is.mark(Integer.MAX_VALUE); + InputStream is = new MarkEnforcingInputStream( + new BufferedInputStream(a.getStream())); + is.mark(READ_LIMIT); try { // use exif to get size if (h.getContentType().equals("image/jpeg")) { @@ -142,6 +146,8 @@ class AttachmentController { // use BitmapFactory to get size if (size.error) { is.reset(); + // need to mark again to re-add read limit + is.mark(READ_LIMIT); size = getSizeFromBitmap(is); } } catch (IOException e) { @@ -158,12 +164,11 @@ class AttachmentController { } // get file extension String extension = getExtensionFromMimeType(size.mimeType); - if (extension == null) { - return new AttachmentItem(messageId, 0, 0, "", "", 0, 0, true); - } + boolean hasError = extension == null || size.error; + if (extension == null) extension = ""; return new AttachmentItem(messageId, size.width, size.height, size.mimeType, extension, thumbnailSize.width, - thumbnailSize.height, size.error); + thumbnailSize.height, hasError); } @Nullable -- GitLab