Author: sebb
Date: Sat Mar 28 16:48:51 2009
New Revision: 759508

URL: http://svn.apache.org/viewvc?rev=759508&view=rev
Log:
Update match()
- add detection of binary format
- tighten detection of ascii formats; ensure last byte is correct

Modified:
    
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/CpioArchiveInputStream.java
URL: 
http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/cpio/CpioArchiveInputStream.java?rev=759508&r1=759507&r2=759508&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 16:48:51 2009
@@ -425,12 +425,34 @@
         return getNextCPIOEntry();
     }
 
+    /**
+     * Checks if the signature matches one of the following magic values:
+     * 
+     * Strings:
+     *  
+     * "070701" - MAGIC_NEW
+     * "070702" - MAGIC_NEW_CRC
+     * "070707" - MAGIC_OLD_ASCII
+     * 
+     * Octal Binary value:
+     * 
+     * 070707 - MAGIC_OLD_BINARY (held as a short) = 0x71C7 or 0xC771
+     */
     public static boolean matches(byte[] signature, int length) {
-        // 3037 3037 30
-
-        if (length < 5) {
+        if (length < 6) {
             return false;
         }
+        
+        // Check binary values
+        if (signature[0] == 0x71 && signature[1] == 0xc7) {
+            return true;
+        }
+        if (signature[1] == 0x71 && signature[2] == 0xc7) {
+            return true;
+        }
+
+        // Check Ascii (String) values
+        // 3037 3037 30nn
         if (signature[0] != 0x30) {
             return false;
         }
@@ -446,7 +468,17 @@
         if (signature[4] != 0x30) {
             return false;
         }
+        // Check last byte
+        if (signature[5] == 0x31) {
+            return true;
+        }
+        if (signature[5] == 0x32) {
+            return true;
+        }
+        if (signature[5] == 0x37) {
+            return true;
+        }
 
-        return true;
+        return false;
     }
 }


Reply via email to