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