diff options
author | Paulo Casanova <pasc@google.com> | 2018-01-25 23:03:02 +0000 |
---|---|---|
committer | android-build-merger <android-build-merger@google.com> | 2018-01-25 23:03:02 +0000 |
commit | e644e81ae3e2b1aebd5851e3730b1587d671373c (patch) | |
tree | 74eed5ea9016f8405336f92b57adc49ee16272f0 | |
parent | 95aba66337f835b3b1ba5dd05a41c4773f8c1577 (diff) | |
parent | d517da5e59127f92917eac2a53024e9074a0a08b (diff) | |
download | apkzlib-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.java | 14 | ||||
-rw-r--r-- | src/test/java/com/android/apkzlib/zip/AlignmentTest.java | 15 |
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 })); + } + } } |