summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Chong Zhang <chz@google.com> 2018-11-30 14:25:08 -0800
committer Chong Zhang <chz@google.com> 2018-11-30 15:37:03 -0800
commit317316fb2b3911a005aa2e877dceb184892b2ec4 (patch)
treef022af22fe783a46b8a8234cdeb177aaec9fd1d5
parent8757179e52e1997876e3af3b574d97df3ea2385a (diff)
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
-rw-r--r--media/java/android/media/ExifInterface.java15
1 files changed, 10 insertions, 5 deletions
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java
index 2395b24f7136..5b8fbc4041ae 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);