diff options
| author | 2019-08-19 14:46:03 +0000 | |
|---|---|---|
| committer | 2019-08-19 14:46:03 +0000 | |
| commit | de41450faed135c9fd108d2b8b190cfabfdbf9d1 (patch) | |
| tree | 5b7d3aedbbacd6ae52a3184bd6b76245f1fe5be7 | |
| parent | 4742ee7b19ce12e8d537b6aefe92316d3a77fae2 (diff) | |
| parent | 38bb5081a773ed437cfb6d028d7cc8c7d6a9eb7a (diff) | |
Merge "Fix ExifInterface#saveAttributes behavior"
| -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 148ffafad491..55583d58e0c2 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); |