From 317316fb2b3911a005aa2e877dceb184892b2ec4 Mon Sep 17 00:00:00 2001 From: Chong Zhang Date: Fri, 30 Nov 2018 14:25:08 -0800 Subject: [PATCH] Fix ExifInterface for .heic when meta is at the end available() bytes is counted after the last read position, after the seek to new position, size should be compared with the avaliable directly (without adding position). bug: 120086693 test: Open .heic files in Downloads/Photos that's either very small (b/117625929, b/111897855), or with the meta at the very end (b/120086693). There shouldn't be error in ExifInterface. Change-Id: I37ac57823b26f03bb0ba555ee6213cf999942d21 --- media/java/android/media/ExifInterface.java | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 2395b24f7136b..5b8fbc4041aec 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -2545,13 +2545,18 @@ public class ExifInterface { if (size == 0) { return 0; } - // We don't allow read positions after the available bytes, - // the input stream won't be able to seek back then. - if (position < 0 || position >= in.available()) { + if (position < 0) { return -1; } try { if (mPosition != position) { + // We don't allow seek to positions after the available bytes, + // the input stream won't be able to seek back then. + // However, if we hit an exception before (mPosition set to -1), + // let it try the seek in hope it might recover. + if (mPosition >= 0 && position >= mPosition + in.available()) { + return -1; + } in.seek(position); mPosition = position; } @@ -2559,8 +2564,8 @@ public class ExifInterface { // If the read will cause us to go over the available bytes, // reduce the size so that we stay in the available range. // Otherwise the input stream may not be able to seek back. - if (mPosition + size > in.available()) { - size = in.available() - (int)mPosition; + if (size > in.available()) { + size = in.available(); } int bytesRead = in.read(buffer, offset, size);