summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPaulo Casanova <pasc@google.com>2018-01-25 23:03:02 +0000
committerandroid-build-merger <android-build-merger@google.com>2018-01-25 23:03:02 +0000
commite644e81ae3e2b1aebd5851e3730b1587d671373c (patch)
tree74eed5ea9016f8405336f92b57adc49ee16272f0
parent95aba66337f835b3b1ba5dd05a41c4773f8c1577 (diff)
parentd517da5e59127f92917eac2a53024e9074a0a08b (diff)
downloadapkzlib-e644e81ae3e2b1aebd5851e3730b1587d671373c.tar.gz
Merge "Fix bug 35841603: updating zip with invalid extra" into studio-master-dev am: 9a5309c7a2 am: df3747fbba
am: d517da5e59 Change-Id: Iee566876156d4fd7917f9d7078f35f2dde20db84
-rw-r--r--src/main/java/com/android/apkzlib/zip/ZFile.java14
-rw-r--r--src/test/java/com/android/apkzlib/zip/AlignmentTest.java15
2 files changed, 27 insertions, 2 deletions
diff --git a/src/main/java/com/android/apkzlib/zip/ZFile.java b/src/main/java/com/android/apkzlib/zip/ZFile.java
index bf16b59..c92e99b 100644
--- a/src/main/java/com/android/apkzlib/zip/ZFile.java
+++ b/src/main/java/com/android/apkzlib/zip/ZFile.java
@@ -934,9 +934,19 @@ public class ZFile implements Closeable {
* the alignment field, if it exists. Also, sum the size of all kept extra field
* segments.
*/
+ ImmutableList<ExtraField.Segment> currentSegments;
+ try {
+ currentSegments = storedEntry.getLocalExtra().getSegments();
+ } catch (IOException e) {
+ /*
+ * Parsing current segments has failed. This means the contents of the extra
+ * field are not valid. We'll continue discarding the existing segments.
+ */
+ currentSegments = ImmutableList.of();
+ }
+
List<ExtraField.Segment> extraFieldSegments = new ArrayList<>();
- int newExtraFieldSize =
- storedEntry.getLocalExtra().getSegments().stream()
+ int newExtraFieldSize = currentSegments.stream()
.filter(s -> s.getHeaderId()
!= ExtraField.ALIGNMENT_ZIP_EXTRA_DATA_FIELD_HEADER_ID)
.peek(extraFieldSegments::add)
diff --git a/src/test/java/com/android/apkzlib/zip/AlignmentTest.java b/src/test/java/com/android/apkzlib/zip/AlignmentTest.java
index 3dfe917..0b825a0 100644
--- a/src/test/java/com/android/apkzlib/zip/AlignmentTest.java
+++ b/src/test/java/com/android/apkzlib/zip/AlignmentTest.java
@@ -770,4 +770,19 @@ public class AlignmentTest {
assertArrayEquals(recognizable2, readSegment(zipFile, 150, recognizable2.length));
assertArrayEquals(twoHundred, readSegment(zipFile, 204, twoHundred.length));
}
+
+ @Test
+ public void alignCoveringEmptySpaceWhenExtraFieldIsInvalid() throws Exception {
+ File zipFile = new File(mTemporaryFolder.getRoot(), "a.zip");
+ ZFileOptions options = new ZFileOptions();
+ options.setCoverEmptySpaceUsingExtraField(true);
+ options.setAlignmentRule(AlignmentRules.constant(100));
+ try (ZFile zf = new ZFile(zipFile, options)) {
+ zf.add("foo", new ByteArrayInputStream(new byte[] { 1, 2, 3, 4 }));
+ StoredEntry foo = zf.get("foo");
+ assertNotNull(foo);
+ foo.setLocalExtra(new ExtraField(new byte[] { 0, 0 }));
+ zf.add("bar", new ByteArrayInputStream(new byte[] { 5, 6, 7, 8 }));
+ }
+ }
}