Author: sebb Date: Sat Mar 28 19:33:56 2009 New Revision: 759561 URL: http://svn.apache.org/viewvc?rev=759561&view=rev Log: Mode will be zero for trailers in old format cpio archives too.
Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java?rev=759561&r1=759560&r2=759561&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveEntry.java Sat Mar 28 19:33:56 2009 @@ -135,6 +135,9 @@ * <p>The MAGIC numbers and other constants are defined in {...@link CpioConstants} * @see "http://people.freebsd.org/~kientzle/libarchive/man/cpio.5.txt" * + * <p> + * N.B. does not handle the cpio "tar" format + * </p> * @NotThreadSafe */ public class CpioArchiveEntry implements CpioConstants, ArchiveEntry { Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java?rev=759561&r1=759560&r2=759561&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java Sat Mar 28 19:33:56 2009 @@ -348,7 +348,10 @@ ret.setDevice(readAsciiLong(6, 8)); ret.setInode(readAsciiLong(6, 8)); - ret.setMode(readAsciiLong(6, 8)); + final long mode = readAsciiLong(6, 8); + if (mode != 0) { + ret.setMode(mode); + } ret.setUID(readAsciiLong(6, 8)); ret.setGID(readAsciiLong(6, 8)); ret.setNumberOfLinks(readAsciiLong(6, 8)); @@ -356,7 +359,12 @@ ret.setTime(readAsciiLong(11, 8)); long namesize = readAsciiLong(6, 8); ret.setSize(readAsciiLong(11, 8)); - ret.setName(readCString((int) namesize)); + final String name = readCString((int) namesize); + ret.setName(name); + if (mode == 0 && !name.equals(CPIO_TRAILER)){ + // TODO - change this to throw + new IOException("Mode 0 only allowed in the trailer. Found: "+name).printStackTrace(); + } return ret; } @@ -367,7 +375,10 @@ ret.setDevice(readBinaryLong(2, swapHalfWord)); ret.setInode(readBinaryLong(2, swapHalfWord)); - ret.setMode(readBinaryLong(2, swapHalfWord)); + final long mode = readBinaryLong(2, swapHalfWord); + if (mode != 0){ + ret.setMode(mode); + } ret.setUID(readBinaryLong(2, swapHalfWord)); ret.setGID(readBinaryLong(2, swapHalfWord)); ret.setNumberOfLinks(readBinaryLong(2, swapHalfWord)); @@ -375,7 +386,12 @@ ret.setTime(readBinaryLong(4, swapHalfWord)); long namesize = readBinaryLong(2, swapHalfWord); ret.setSize(readBinaryLong(4, swapHalfWord)); - ret.setName(readCString((int) namesize)); + final String name = readCString((int) namesize); + ret.setName(name); + if (mode == 0 && !name.equals(CPIO_TRAILER)){ + // TODO - change this to throw + new IOException("Mode 0 only allowed in the trailer. Found: "+name).printStackTrace(); + } skip(ret.getHeaderPadCount()); return ret;