Author: bodewig Date: Thu Aug 8 16:18:45 2013 New Revision: 1511850 URL: http://svn.apache.org/r1511850 Log: COMPRESS-236 - CpioArchiveInputStream doesn't like Redline RPM's archives. Patch by Andrew Duffy
Added: commons/proper/compress/trunk/src/test/resources/redline.cpio (with props) Modified: commons/proper/compress/trunk/src/changes/changes.xml 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 commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioUtil.java commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.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=1511850&r1=1511849&r2=1511850&view=diff ============================================================================== --- commons/proper/compress/trunk/src/changes/changes.xml (original) +++ commons/proper/compress/trunk/src/changes/changes.xml Thu Aug 8 16:18:45 2013 @@ -80,11 +80,16 @@ The <action> type attribute can be add,u due-to="BELUGA BEHR"> Readabilty patch to TarArchiveInputStream. </action> - <action type="update" date="2013-07-08" issue="COMPRESS-234" + <action type="update" date="2013-08-08" issue="COMPRESS-234" due-to="BELUGA BEHR"> Performance improvements to TarArchiveInputStream, in particular to the skip method. </action> + <action type="fix" date="2013-08-08" issue="COMPRESS-236" + due-to="Andrew Duffy"> + CpioArchiveInputStream failed to read archives created by + Redline RPM. + </action> </release> <release version="1.5" date="2013-03-14" description="Release 1.5"> 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=1511850&r1=1511849&r2=1511850&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 Thu Aug 8 16:18:45 2013 @@ -596,7 +596,7 @@ public class CpioArchiveEntry implements * @return TRUE if this entry is a block device. */ public boolean isBlockDevice() { - return (this.mode & S_IFMT) == C_ISBLK; + return CpioUtil.fileType(mode) == C_ISBLK; } /** @@ -605,7 +605,7 @@ public class CpioArchiveEntry implements * @return TRUE if this entry is a character device. */ public boolean isCharacterDevice() { - return (this.mode & S_IFMT) == C_ISCHR; + return CpioUtil.fileType(mode) == C_ISCHR; } /** @@ -614,7 +614,7 @@ public class CpioArchiveEntry implements * @return TRUE if this entry is a directory. */ public boolean isDirectory() { - return (this.mode & S_IFMT) == C_ISDIR; + return CpioUtil.fileType(mode) == C_ISDIR; } /** @@ -623,7 +623,7 @@ public class CpioArchiveEntry implements * @return TRUE if this entry is a network device. */ public boolean isNetwork() { - return (this.mode & S_IFMT) == C_ISNWK; + return CpioUtil.fileType(mode) == C_ISNWK; } /** @@ -632,7 +632,7 @@ public class CpioArchiveEntry implements * @return TRUE if this entry is a pipe. */ public boolean isPipe() { - return (this.mode & S_IFMT) == C_ISFIFO; + return CpioUtil.fileType(mode) == C_ISFIFO; } /** @@ -641,7 +641,7 @@ public class CpioArchiveEntry implements * @return TRUE if this entry is a regular file. */ public boolean isRegularFile() { - return (this.mode & S_IFMT) == C_ISREG; + return CpioUtil.fileType(mode) == C_ISREG; } /** @@ -650,7 +650,7 @@ public class CpioArchiveEntry implements * @return TRUE if this entry is a socket. */ public boolean isSocket() { - return (this.mode & S_IFMT) == C_ISSOCK; + return CpioUtil.fileType(mode) == C_ISSOCK; } /** @@ -659,7 +659,7 @@ public class CpioArchiveEntry implements * @return TRUE if this entry is a symbolic link. */ public boolean isSymbolicLink() { - return (this.mode & S_IFMT) == C_ISLNK; + return CpioUtil.fileType(mode) == C_ISLNK; } /** 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=1511850&r1=1511849&r2=1511850&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 Thu Aug 8 16:18:45 2013 @@ -328,7 +328,7 @@ public class CpioArchiveInputStream exte ret.setInode(readAsciiLong(8, 16)); long mode = readAsciiLong(8, 16); - if (mode != 0){ // mode is initialised to 0 + if (CpioUtil.fileType(mode) != 0){ // mode is initialised to 0 ret.setMode(mode); } ret.setUID(readAsciiLong(8, 16)); @@ -344,7 +344,7 @@ public class CpioArchiveInputStream exte ret.setChksum(readAsciiLong(8, 16)); String name = readCString((int) namesize); ret.setName(name); - if (mode == 0 && !name.equals(CPIO_TRAILER)){ + if (CpioUtil.fileType(mode) == 0 && !name.equals(CPIO_TRAILER)){ throw new IOException("Mode 0 only allowed in the trailer. Found entry name: "+name + " Occured at byte: " + getBytesRead()); } skip(ret.getHeaderPadCount()); @@ -358,7 +358,7 @@ public class CpioArchiveInputStream exte ret.setDevice(readAsciiLong(6, 8)); ret.setInode(readAsciiLong(6, 8)); final long mode = readAsciiLong(6, 8); - if (mode != 0) { + if (CpioUtil.fileType(mode) != 0) { ret.setMode(mode); } ret.setUID(readAsciiLong(6, 8)); @@ -370,7 +370,7 @@ public class CpioArchiveInputStream exte ret.setSize(readAsciiLong(11, 8)); final String name = readCString((int) namesize); ret.setName(name); - if (mode == 0 && !name.equals(CPIO_TRAILER)){ + if (CpioUtil.fileType(mode) == 0 && !name.equals(CPIO_TRAILER)){ throw new IOException("Mode 0 only allowed in the trailer. Found entry: "+ name + " Occured at byte: " + getBytesRead()); } @@ -384,7 +384,7 @@ public class CpioArchiveInputStream exte ret.setDevice(readBinaryLong(2, swapHalfWord)); ret.setInode(readBinaryLong(2, swapHalfWord)); final long mode = readBinaryLong(2, swapHalfWord); - if (mode != 0){ + if (CpioUtil.fileType(mode) != 0){ ret.setMode(mode); } ret.setUID(readBinaryLong(2, swapHalfWord)); @@ -396,7 +396,7 @@ public class CpioArchiveInputStream exte ret.setSize(readBinaryLong(4, swapHalfWord)); final String name = readCString((int) namesize); ret.setName(name); - if (mode == 0 && !name.equals(CPIO_TRAILER)){ + if (CpioUtil.fileType(mode) == 0 && !name.equals(CPIO_TRAILER)){ throw new IOException("Mode 0 only allowed in the trailer. Found entry: "+name + "Occured at byte: " + getBytesRead()); } skip(ret.getHeaderPadCount()); Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioUtil.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioUtil.java?rev=1511850&r1=1511849&r2=1511850&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioUtil.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioUtil.java Thu Aug 8 16:18:45 2013 @@ -24,6 +24,14 @@ package org.apache.commons.compress.arch * @Immutable */ class CpioUtil { + + /** + * Extracts the file type bits from a mode. + */ + static long fileType(long mode) { + return mode & CpioConstants.S_IFMT; + } + /** * Converts a byte array to a long. Halfwords can be swapped by setting * swapHalfWord=true. Modified: commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.java?rev=1511850&r1=1511849&r2=1511850&view=diff ============================================================================== --- commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.java (original) +++ commons/proper/compress/trunk/src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.java Thu Aug 8 16:18:45 2013 @@ -45,4 +45,18 @@ public class CpioArchiveInputStreamTest in.close(); assertEquals(result.toString(), expected.toString()); } + + public void testCpioUnarchiveCreatedByRedlineRpm() throws Exception { + CpioArchiveInputStream in = + new CpioArchiveInputStream(new FileInputStream(getFile("redline.cpio"))); + CpioArchiveEntry entry= null; + + int count = 0; + while ((entry = (CpioArchiveEntry) in.getNextEntry()) != null) { + count++; + } + in.close(); + + assertEquals(count, 1); + } } Added: commons/proper/compress/trunk/src/test/resources/redline.cpio URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/test/resources/redline.cpio?rev=1511850&view=auto ============================================================================== Binary file - no diff available. Propchange: commons/proper/compress/trunk/src/test/resources/redline.cpio ------------------------------------------------------------------------------ svn:mime-type = application/octet-stream