Simple and pragmatic: -)

Gary

On Sun, Apr 22, 2018, 09:45 <bode...@apache.org> wrote:

> Repository: commons-compress
> Updated Branches:
>   refs/heads/master 777853369 -> 166b186e8
>
>
> COMPRESS-447 turn ArrayIndexOutOfBoundsExceptions into ZipExceptions
>
>
> Project: http://git-wip-us.apache.org/repos/asf/commons-compress/repo
> Commit:
> http://git-wip-us.apache.org/repos/asf/commons-compress/commit/bd3e6cf2
> Tree:
> http://git-wip-us.apache.org/repos/asf/commons-compress/tree/bd3e6cf2
> Diff:
> http://git-wip-us.apache.org/repos/asf/commons-compress/diff/bd3e6cf2
>
> Branch: refs/heads/master
> Commit: bd3e6cf204f249c2d60eca2268c8b9f402149f1b
> Parents: 7778533
> Author: Stefan Bodewig <bode...@apache.org>
> Authored: Sun Apr 22 17:44:25 2018 +0200
> Committer: Stefan Bodewig <bode...@apache.org>
> Committed: Sun Apr 22 17:44:25 2018 +0200
>
> ----------------------------------------------------------------------
>  src/changes/changes.xml                         |  5 ++++
>  .../compress/archivers/zip/ExtraFieldUtils.java |  5 ++++
>  .../archivers/zip/ExtraFieldUtilsTest.java      | 29 ++++++++++++++++++++
>  3 files changed, 39 insertions(+)
> ----------------------------------------------------------------------
>
>
>
> http://git-wip-us.apache.org/repos/asf/commons-compress/blob/bd3e6cf2/src/changes/changes.xml
> ----------------------------------------------------------------------
> diff --git a/src/changes/changes.xml b/src/changes/changes.xml
> index 31b2439..e1d5ecc 100644
> --- a/src/changes/changes.xml
> +++ b/src/changes/changes.xml
> @@ -55,6 +55,11 @@ The <action> type attribute can be
> add,update,fix,remove.
>          Fixed some code examples.
>          Github Pull Request #63.
>        </action>
> +      <action issue="COMPRESS-447" type="fix" date="2018-04-22">
> +        Certain errors when parsing ZIP extra fields in corrupt
> +        archives are now turned into ZipException, they used to
> +        manifest as ArrayIndexOutOfBoundsException before.
> +      </action>
>      </release>
>      <release version="1.16.1" date="2018-02-10"
>               description="Release 1.16.1">
>
>
> http://git-wip-us.apache.org/repos/asf/commons-compress/blob/bd3e6cf2/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java
> ----------------------------------------------------------------------
> diff --git
> a/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java
> b/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java
> index 14691c4..b41dbb6 100644
> ---
> a/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java
> +++
> b/src/main/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtils.java
> @@ -175,12 +175,17 @@ public class ExtraFieldUtils {
>              }
>              try {
>                  final ZipExtraField ze = createExtraField(headerId);
> +                try {
>                  if (local) {
>                      ze.parseFromLocalFileData(data, start + WORD, length);
>                  } else {
>                      ze.parseFromCentralDirectoryData(data, start + WORD,
>                                                       length);
>                  }
> +                } catch (ArrayIndexOutOfBoundsException aiobe) {
> +                    throw (ZipException) new ZipException("Failed to
> parse corrupt ZIP extra field of type "
> +                        +
> Integer.toHexString(headerId.getValue())).initCause(aiobe);
> +                }
>                  v.add(ze);
>              } catch (final InstantiationException |
> IllegalAccessException ie) {
>                  throw (ZipException) new
> ZipException(ie.getMessage()).initCause(ie);
>
>
> http://git-wip-us.apache.org/repos/asf/commons-compress/blob/bd3e6cf2/src/test/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtilsTest.java
> ----------------------------------------------------------------------
> diff --git
> a/src/test/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtilsTest.java
> b/src/test/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtilsTest.java
> index 3803817..56b7d76 100644
> ---
> a/src/test/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtilsTest.java
> +++
> b/src/test/java/org/apache/commons/compress/archivers/zip/ExtraFieldUtilsTest.java
> @@ -23,6 +23,8 @@ import static org.junit.Assert.*;
>  import org.junit.Before;
>  import org.junit.Test;
>
> +import java.util.zip.ZipException;
> +
>  /**
>   * JUnit testcases for
> org.apache.commons.compress.archivers.zip.ExtraFieldUtils.
>   *
> @@ -93,6 +95,33 @@ public class ExtraFieldUtilsTest implements UnixStat {
>                           e.getMessage());
>          }
>      }
> +
> +    @Test
> +    public void parseTurnsArrayIndexOutOfBoundsIntoZipException() throws
> Exception {
> +        AsiExtraField f = new AsiExtraField();
> +        f.setLinkedFile("foo");
> +        byte[] l = f.getLocalFileDataData();
> +        // manipulate size of path name to read 4 rather than 3
> +        l[9] = 4;
> +        // and fake CRC so we actually reach the AIOBE
> +        l[0] = (byte) 0x52;
> +        l[1] = (byte) 0x26;
> +        l[2] = (byte) 0x18;
> +        l[3] = (byte) 0x19;
> +        byte[] d = new byte[4 + l.length];
> +        System.arraycopy(f.getHeaderId().getBytes(), 0, d, 0, 2);
> +        System.arraycopy(f.getLocalFileDataLength().getBytes(), 0, d, 2,
> 2);
> +        System.arraycopy(l, 0, d, 4, l.length);
> +        try {
> +            ExtraFieldUtils.parse(d);
> +            fail("data should be invalid");
> +        } catch (final ZipException e) {
> +            assertEquals("message",
> +                         "Failed to parse corrupt ZIP extra field of type
> 756e",
> +                         e.getMessage());
> +        }
> +    }
> +
>      @Test
>      public void testParseCentral() throws Exception {
>          final ZipExtraField[] ze = ExtraFieldUtils.parse(data,false);
>
>

Reply via email to