Author: bodewig Date: Thu Aug 14 05:41:40 2014 New Revision: 1617883 URL: http://svn.apache.org/r1617883 Log: COMPRESS-287 ignore unknown properties in 7z file headers
Modified: commons/proper/compress/trunk/src/changes/changes.xml commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java Modified: commons/proper/compress/trunk/src/changes/changes.xml URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/changes/changes.xml?rev=1617883&r1=1617882&r2=1617883&view=diff ============================================================================== --- commons/proper/compress/trunk/src/changes/changes.xml (original) +++ commons/proper/compress/trunk/src/changes/changes.xml Thu Aug 14 05:41:40 2014 @@ -48,6 +48,10 @@ The <action> type attribute can be add,u due-to="Matthias Stevens"> Added support for DEFLATE streams without any gzip framing. </action> + <action type="fix" date="2014-08-14" issue="COMPRESS-287"> + When reading 7z files unknown file properties and properties + of type kDummy are now ignored. + </action> </release> <release version="1.8.1" date="2014-05-14" Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java?rev=1617883&r1=1617882&r2=1617883&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/sevenz/SevenZFile.java Thu Aug 14 05:41:40 2014 @@ -244,7 +244,7 @@ public class SevenZFile implements Close } if (nid != NID.kEnd) { - throw new IOException("Badly terminated header"); + throw new IOException("Badly terminated header, found " + nid); } } @@ -708,13 +708,21 @@ public class SevenZFile implements Close throw new IOException("kStartPos is unsupported, please report"); } case NID.kDummy: { - throw new IOException("kDummy is unsupported, please report"); + // 7z 9.20 asserts the content is all zeros and ignores the property + // Compress up to 1.8.1 would throw an exception, now we ignore it (see COMPRESS-287 + + if (skipBytesFully(header, size) < size) { + throw new IOException("Incomplete kDummy property"); + } + break; } - + default: { - throw new IOException("Unknown property " + propertyType); - // FIXME: Should actually: - //header.skipBytes((int)size); + // Compress up to 1.8.1 would throw an exception, now we ignore it (see COMPRESS-287 + if (skipBytesFully(header, size) < size) { + throw new IOException("Incomplete property of type " + propertyType); + } + break; } } } @@ -944,4 +952,28 @@ public class SevenZFile implements Close } return true; } + + private static long skipBytesFully(DataInput input, long bytesToSkip) throws IOException { + if (bytesToSkip < 1) { + return 0; + } + long skipped = 0; + while (bytesToSkip > Integer.MAX_VALUE) { + long skippedNow = skipBytesFully(input, Integer.MAX_VALUE); + if (skippedNow == 0) { + return skipped; + } + skipped += skippedNow; + bytesToSkip -= skippedNow; + } + while (bytesToSkip > 0) { + int skippedNow = input.skipBytes((int) bytesToSkip); + if (skippedNow == 0) { + return skipped; + } + skipped += skippedNow; + bytesToSkip -= skippedNow; + } + return skipped; + } }