This is an automated email from the ASF dual-hosted git repository.

bodewig pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/commons-compress.git

commit f71d3ddd9f9ab2b6c4c072168451e6f72920398f
Author: Stefan Bodewig <bode...@apache.org>
AuthorDate: Sat May 23 18:51:18 2020 +0200

    COMPRESS-517 make sure flags and existing fields agree with each other
---
 src/changes/changes.xml                                        |  3 +++
 .../compress/archivers/zip/X5455_ExtendedTimestamp.java        |  6 ++++++
 .../compress/archivers/zip/X5455_ExtendedTimestampTest.java    | 10 ++++++++++
 3 files changed, 19 insertions(+)

diff --git a/src/changes/changes.xml b/src/changes/changes.xml
index db5a000..dcad6f0 100644
--- a/src/changes/changes.xml
+++ b/src/changes/changes.xml
@@ -73,6 +73,9 @@ The <action> type attribute can be add,update,fix,remove.
         throw the expected IOException rather than obscure
         RuntimeExceptions.
       </action>
+      <action issue="COMPRESS-517" type="fix" date="2020-05-23">
+        Improved parsing of X5455_ExtendedTimestamp ZIP extra field.
+      </action>
     </release>
     <release version="1.20" date="2020-02-08"
              description="Release 1.20">
diff --git 
a/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java
 
b/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java
index bfc0b0d..02f5bc9 100644
--- 
a/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java
+++ 
b/src/main/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestamp.java
@@ -227,14 +227,20 @@ public class X5455_ExtendedTimestamp implements 
ZipExtraField, Cloneable, Serial
         if (bit0_modifyTimePresent && offset + 4 <= len) {
             modifyTime = new ZipLong(data, offset);
             offset += 4;
+        } else {
+            bit0_modifyTimePresent = false;
         }
         if (bit1_accessTimePresent && offset + 4 <= len) {
             accessTime = new ZipLong(data, offset);
             offset += 4;
+        } else {
+            bit1_accessTimePresent = false;
         }
         if (bit2_createTimePresent && offset + 4 <= len) {
             createTime = new ZipLong(data, offset);
             offset += 4; // NOSONAR - assignment as documentation
+        } else {
+            bit2_createTimePresent = false;
         }
     }
 
diff --git 
a/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
 
b/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
index e3bd60e..51a807e 100644
--- 
a/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
+++ 
b/src/test/java/org/apache/commons/compress/archivers/zip/X5455_ExtendedTimestampTest.java
@@ -39,6 +39,7 @@ import static 
org.apache.commons.compress.AbstractTestCase.rmdir;
 import static 
org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp.ACCESS_TIME_BIT;
 import static 
org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp.CREATE_TIME_BIT;
 import static 
org.apache.commons.compress.archivers.zip.X5455_ExtendedTimestamp.MODIFY_TIME_BIT;
+import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
@@ -472,6 +473,15 @@ public class X5455_ExtendedTimestampTest {
         assertEquals(0, xf.getFlags());
     }
 
+    @Test
+    public void resetsFlagsWhenLocalFileArrayIsTooShort() throws Exception {
+        final byte[] local = new byte[] {
+            7
+        }; // claims all three time values would be present, but they are not
+        xf.parseFromLocalFileData(local, 0, 1);
+        assertArrayEquals(new byte[1], xf.getLocalFileDataData());
+    }
+
     private void parseReparse(
             final ZipLong time,
             final byte[] expectedLocal,

Reply via email to