diff options
| author | 2019-08-02 17:06:48 +0900 | |
|---|---|---|
| committer | 2019-08-12 10:02:47 +0900 | |
| commit | 38bb5081a773ed437cfb6d028d7cc8c7d6a9eb7a (patch) | |
| tree | 37703a05a5b778bc9c314b38f3c183f2d7cad901 | |
| parent | 26f2c379d0c5e6f6f37419ed06d57f252b9501e7 (diff) | |
Fix ExifInterface#saveAttributes behavior
cherry-pick from aosp/1015050, aosp/1079822
1. Currently, calling ExifInterface#saveAttributes with StrictMode
that detects unbuffered I/O throws an exception. Change
saveJpegAttributes to take BufferedInput/OutputStreams
as parameters.
2. Change saveAttributes so that when an exception is thrown, the
original image file is not deleted but restored.
3. Distinguish between two identical exception messages in
saveAttributes.
4. Add test for checking StrictMode.
Bug: 137139466
Test: Run atest CtsMediaTestCases:android.media.cts.ExifInterfaceTest
Change-Id: I9e4111ec35740198bdbdba0c9b609875b6231474
| -rw-r--r-- | media/java/android/media/ExifInterface.java | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/media/java/android/media/ExifInterface.java b/media/java/android/media/ExifInterface.java index 7ae6a0277bff..496d9d70599a 100644 --- a/media/java/android/media/ExifInterface.java +++ b/media/java/android/media/ExifInterface.java @@ -37,6 +37,7 @@ import libcore.io.IoUtils; import libcore.io.Streams; import java.io.BufferedInputStream; +import java.io.BufferedOutputStream; import java.io.ByteArrayInputStream; import java.io.DataInput; import java.io.DataInputStream; @@ -1866,14 +1867,17 @@ public class ExifInterface { FileInputStream in = null; FileOutputStream out = null; + File originalFile = null; + if (mFilename != null) { + originalFile = new File(mFilename); + } File tempFile = null; try { // Move the original file to temporary file. if (mFilename != null) { tempFile = new File(mFilename + ".tmp"); - File originalFile = new File(mFilename); if (!originalFile.renameTo(tempFile)) { - throw new IOException("Could'nt rename to " + tempFile.getAbsolutePath()); + throw new IOException("Couldn't rename to " + tempFile.getAbsolutePath()); } } else if (mSeekableFileDescriptor != null) { tempFile = File.createTempFile("temp", "jpg"); @@ -1882,8 +1886,8 @@ public class ExifInterface { out = new FileOutputStream(tempFile); Streams.copy(in, out); } - } catch (ErrnoException e) { - throw e.rethrowAsIOException(); + } catch (Exception e) { + throw new IOException("Failed to copy original file to temp file", e); } finally { IoUtils.closeQuietly(in); IoUtils.closeQuietly(out); @@ -1900,9 +1904,18 @@ public class ExifInterface { Os.lseek(mSeekableFileDescriptor, 0, OsConstants.SEEK_SET); out = new FileOutputStream(mSeekableFileDescriptor); } - saveJpegAttributes(in, out); - } catch (ErrnoException e) { - throw e.rethrowAsIOException(); + try (BufferedInputStream bufferedIn = new BufferedInputStream(in); + BufferedOutputStream bufferedOut = new BufferedOutputStream(out)) { + saveJpegAttributes(bufferedIn, bufferedOut); + } + } catch (Exception e) { + if (mFilename != null) { + if (!tempFile.renameTo(originalFile)) { + throw new IOException("Couldn't restore original file: " + + originalFile.getAbsolutePath()); + } + } + throw new IOException("Failed to save new file", e); } finally { IoUtils.closeQuietly(in); IoUtils.closeQuietly(out); |