From 5c89bbedb74ab8b5d7d1d5217f83a271accfd163 Mon Sep 17 00:00:00 2001 From: eguven Date: Tue, 10 Jan 2017 02:53:21 -0800 Subject: [PATCH] Fix leftover bytes in cached content index file Extra calls to CipherOutputStream.close() causes each time extra 16 bytes written to the underlying OutputStream. Prevented close() is called more than once and also discarded any data in ReusableBufferedOutputStream buffer on reset(). ------------- Created by MOE: https://github.com/google/moe MOE_MIGRATED_REVID=144063120 --- .../exoplayer2/upstream/cache/CachedContentIndexTest.java | 8 +++++++- .../exoplayer2/upstream/cache/CachedContentIndex.java | 3 +++ .../exoplayer2/util/ReusableBufferedOutputStream.java | 1 + 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/library/src/androidTest/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java b/library/src/androidTest/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java index dd4de7cce2..71e5a5b6d0 100644 --- a/library/src/androidTest/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java +++ b/library/src/androidTest/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndexTest.java @@ -181,7 +181,7 @@ public class CachedContentIndexTest extends InstrumentationTestCase { // Assert file content is different FileInputStream fis1 = new FileInputStream(file1); FileInputStream fis2 = new FileInputStream(file2); - for (int b; (b = fis1.read()) == fis2.read();) { + for (int b; (b = fis1.read()) == fis2.read(); ) { assertTrue(b != -1); } @@ -205,6 +205,12 @@ public class CachedContentIndexTest extends InstrumentationTestCase { // Non encrypted index file can be read even when encryption key provided. assertStoredAndLoadedEqual(new CachedContentIndex(cacheDir), new CachedContentIndex(cacheDir, key)); + + // Test multiple store() calls + CachedContentIndex index = new CachedContentIndex(cacheDir, key); + index.addNew(new CachedContent(15, "key3", 110)); + index.store(); + assertStoredAndLoadedEqual(index, new CachedContentIndex(cacheDir, key)); } private void assertStoredAndLoadedEqual(CachedContentIndex index, CachedContentIndex index2) diff --git a/library/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java b/library/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java index 9e38dabc31..2ec4099e01 100644 --- a/library/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java +++ b/library/src/main/java/com/google/android/exoplayer2/upstream/cache/CachedContentIndex.java @@ -302,6 +302,9 @@ import javax.crypto.spec.SecretKeySpec; } output.writeInt(hashCode); atomicFile.endWrite(output); + // Avoid calling close twice. Duplicate CipherOutputStream.close calls did + // not used to be no-ops: https://android-review.googlesource.com/#/c/272799/ + output = null; } catch (IOException e) { throw new CacheException(e); } finally { diff --git a/library/src/main/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStream.java b/library/src/main/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStream.java index a3d1d4d02e..1db3d2c1f4 100644 --- a/library/src/main/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStream.java +++ b/library/src/main/java/com/google/android/exoplayer2/util/ReusableBufferedOutputStream.java @@ -67,6 +67,7 @@ public final class ReusableBufferedOutputStream extends BufferedOutputStream { public void reset(OutputStream out) { Assertions.checkState(closed); this.out = out; + count = 0; closed = false; } }