Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 317316fb authored by Chong Zhang's avatar Chong Zhang
Browse files

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
parent 8757179e
Loading
Loading
Loading
Loading
+10 −5
Original line number Diff line number Diff line
@@ -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);