[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.
parent d3b6f484
Pipeline #2910 passed with stage
in 10 minutes and 56 seconds
...@@ -6,6 +6,8 @@ import android.support.annotation.Nullable; ...@@ -6,6 +6,8 @@ import android.support.annotation.Nullable;
import android.support.media.ExifInterface; import android.support.media.ExifInterface;
import android.webkit.MimeTypeMap; import android.webkit.MimeTypeMap;
import com.bumptech.glide.util.MarkEnforcingInputStream;
import org.briarproject.bramble.api.Pair; import org.briarproject.bramble.api.Pair;
import org.briarproject.bramble.api.db.DatabaseExecutor; import org.briarproject.bramble.api.db.DatabaseExecutor;
import org.briarproject.bramble.api.db.DbException; import org.briarproject.bramble.api.db.DbException;
...@@ -44,6 +46,7 @@ class AttachmentController { ...@@ -44,6 +46,7 @@ class AttachmentController {
private static final Logger LOG = private static final Logger LOG =
getLogger(AttachmentController.class.getName()); getLogger(AttachmentController.class.getName());
private static final int READ_LIMIT = 1024 * 8192;
private final MessagingManager messagingManager; private final MessagingManager messagingManager;
private final int defaultSize; private final int defaultSize;
...@@ -128,8 +131,9 @@ class AttachmentController { ...@@ -128,8 +131,9 @@ class AttachmentController {
} }
Size size = new Size(); Size size = new Size();
InputStream is = new BufferedInputStream(a.getStream()); InputStream is = new MarkEnforcingInputStream(
is.mark(Integer.MAX_VALUE); new BufferedInputStream(a.getStream()));
is.mark(READ_LIMIT);
try { try {
// use exif to get size // use exif to get size
if (h.getContentType().equals("image/jpeg")) { if (h.getContentType().equals("image/jpeg")) {
...@@ -142,6 +146,8 @@ class AttachmentController { ...@@ -142,6 +146,8 @@ class AttachmentController {
// use BitmapFactory to get size // use BitmapFactory to get size
if (size.error) { if (size.error) {
is.reset(); is.reset();
// need to mark again to re-add read limit
is.mark(READ_LIMIT);
size = getSizeFromBitmap(is); size = getSizeFromBitmap(is);
} }
} catch (IOException e) { } catch (IOException e) {
...@@ -158,12 +164,11 @@ class AttachmentController { ...@@ -158,12 +164,11 @@ class AttachmentController {
} }
// get file extension // get file extension
String extension = getExtensionFromMimeType(size.mimeType); String extension = getExtensionFromMimeType(size.mimeType);
if (extension == null) { boolean hasError = extension == null || size.error;
return new AttachmentItem(messageId, 0, 0, "", "", 0, 0, true); if (extension == null) extension = "";
}
return new AttachmentItem(messageId, size.width, size.height, return new AttachmentItem(messageId, size.width, size.height,
size.mimeType, extension, thumbnailSize.width, size.mimeType, extension, thumbnailSize.width,
thumbnailSize.height, size.error); thumbnailSize.height, hasError);
} }
@Nullable @Nullable
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment