From ed658b8e8d4ad839d721bc79ff4f2175a9ff5413 Mon Sep 17 00:00:00 2001 From: Oliver Woodman Date: Fri, 10 Apr 2015 22:33:10 +0100 Subject: [PATCH] Attempt to guard against ExoCache corruption. --- .../exoplayer/upstream/TeeDataSource.java | 7 +++++-- .../upstream/cache/CacheDataSink.java | 19 ++++++++++++++++--- .../google/android/exoplayer/util/Util.java | 14 ++++++++++++++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/library/src/main/java/com/google/android/exoplayer/upstream/TeeDataSource.java b/library/src/main/java/com/google/android/exoplayer/upstream/TeeDataSource.java index 2e140db6c8..2623e8ce7f 100644 --- a/library/src/main/java/com/google/android/exoplayer/upstream/TeeDataSource.java +++ b/library/src/main/java/com/google/android/exoplayer/upstream/TeeDataSource.java @@ -61,8 +61,11 @@ public final class TeeDataSource implements DataSource { @Override public void close() throws IOException { - upstream.close(); - dataSink.close(); + try { + upstream.close(); + } finally { + dataSink.close(); + } } } diff --git a/library/src/main/java/com/google/android/exoplayer/upstream/cache/CacheDataSink.java b/library/src/main/java/com/google/android/exoplayer/upstream/cache/CacheDataSink.java index 942a29f0c7..01e06b5158 100644 --- a/library/src/main/java/com/google/android/exoplayer/upstream/cache/CacheDataSink.java +++ b/library/src/main/java/com/google/android/exoplayer/upstream/cache/CacheDataSink.java @@ -19,6 +19,7 @@ import com.google.android.exoplayer.C; import com.google.android.exoplayer.upstream.DataSink; import com.google.android.exoplayer.upstream.DataSpec; import com.google.android.exoplayer.util.Assertions; +import com.google.android.exoplayer.util.Util; import java.io.File; import java.io.FileNotFoundException; @@ -115,11 +116,23 @@ public class CacheDataSink implements DataSink { } private void closeCurrentOutputStream() throws IOException { - if (outputStream != null) { + if (outputStream == null) { + return; + } + + boolean success = false; + try { outputStream.flush(); - outputStream.close(); + outputStream.getFD().sync(); + success = true; + } finally { + Util.closeQuietly(outputStream); + if (success) { + cache.commitFile(file); + } else { + file.delete(); + } outputStream = null; - cache.commitFile(file); file = null; } } diff --git a/library/src/main/java/com/google/android/exoplayer/util/Util.java b/library/src/main/java/com/google/android/exoplayer/util/Util.java index 8319a7ad88..6160427890 100644 --- a/library/src/main/java/com/google/android/exoplayer/util/Util.java +++ b/library/src/main/java/com/google/android/exoplayer/util/Util.java @@ -22,6 +22,7 @@ import android.text.TextUtils; import java.io.IOException; import java.io.InputStream; +import java.io.OutputStream; import java.lang.reflect.Method; import java.math.BigDecimal; import java.net.HttpURLConnection; @@ -129,6 +130,19 @@ public final class Util { } } + /** + * Closes an {@link OutputStream}, suppressing any {@link IOException} that may occur. + * + * @param outputStream The {@link OutputStream} to close. + */ + public static void closeQuietly(OutputStream outputStream) { + try { + outputStream.close(); + } catch (IOException e) { + // Ignore. + } + } + /** * Converts text to lower case using {@link Locale#US}. *