diff --git src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
index 13fb24a..14b2cce 100644
--- src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
+++ src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java
@@ -328,7 +328,7 @@ public class CpioArchiveInputStream extends ArchiveInputStream implements
 
         ret.setInode(readAsciiLong(8, 16));
         long mode = readAsciiLong(8, 16);
-        if (mode != 0){ // mode is initialised to 0
+        if ((mode & CpioArchiveEntry.S_IFMT) != 0){ // mode is initialised to 0
             ret.setMode(mode);
         }
         ret.setUID(readAsciiLong(8, 16));
@@ -344,7 +344,7 @@ public class CpioArchiveInputStream extends ArchiveInputStream implements
         ret.setChksum(readAsciiLong(8, 16));
         String name = readCString((int) namesize);
         ret.setName(name);
-        if (mode == 0 && !name.equals(CPIO_TRAILER)){
+        if ((mode & CpioArchiveEntry.S_IFMT) == 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 extends ArchiveInputStream implements
         ret.setDevice(readAsciiLong(6, 8));
         ret.setInode(readAsciiLong(6, 8));
         final long mode = readAsciiLong(6, 8);
-        if (mode != 0) {
+        if ((mode & CpioArchiveEntry.S_IFMT) != 0) {
             ret.setMode(mode);
         }
         ret.setUID(readAsciiLong(6, 8));
@@ -370,7 +370,7 @@ public class CpioArchiveInputStream extends ArchiveInputStream implements
         ret.setSize(readAsciiLong(11, 8));
         final String name = readCString((int) namesize);
         ret.setName(name);
-        if (mode == 0 && !name.equals(CPIO_TRAILER)){
+        if ((mode & CpioArchiveEntry.S_IFMT) == 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 extends ArchiveInputStream implements
         ret.setDevice(readBinaryLong(2, swapHalfWord));
         ret.setInode(readBinaryLong(2, swapHalfWord));
         final long mode = readBinaryLong(2, swapHalfWord);
-        if (mode != 0){
+        if ((mode & CpioArchiveEntry.S_IFMT) != 0){
             ret.setMode(mode);
         }
         ret.setUID(readBinaryLong(2, swapHalfWord));
@@ -396,7 +396,7 @@ public class CpioArchiveInputStream extends ArchiveInputStream implements
         ret.setSize(readBinaryLong(4, swapHalfWord));
         final String name = readCString((int) namesize);
         ret.setName(name);
-        if (mode == 0 && !name.equals(CPIO_TRAILER)){
+        if ((mode & CpioArchiveEntry.S_IFMT) == 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());
diff --git src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.java src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.java
index bcef7f7..8163f03 100644
--- src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.java
+++ src/test/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStreamTest.java
@@ -46,4 +46,18 @@ public class CpioArchiveInputStreamTest extends AbstractTestCase {
          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);
+    }
 }
diff --git src/test/resources/redline.cpio src/test/resources/redline.cpio
new file mode 100644
index 0000000000000000000000000000000000000000..f754d73ab1a26d887abe17e31cd054ec917fddda
GIT binary patch
literal 268
zcmXpoH!wFaG=KmwZDE*b0_CGqhNgyTN#?0(Mo@`lC~XO)VdkLeGc<z<=;@c_7U*ZB
z=H%qZm**Gdr0A7YlrVUJ_zK}5z9P^y2=_p=;c*YlTr`@1dkm6b>O+DYJ$+n*6crU2
GfB*m)0y*&j

literal 0
HcmV?d00001

