summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author Jin Seok Park <jinpark@google.com> 2019-08-02 17:06:48 +0900
committer Jin Seok Park <jinpark@google.com> 2019-08-12 10:02:47 +0900
commit38bb5081a773ed437cfb6d028d7cc8c7d6a9eb7a (patch)
tree37703a05a5b778bc9c314b38f3c183f2d7cad901
parent26f2c379d0c5e6f6f37419ed06d57f252b9501e7 (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.java27
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);