Author: sebb Date: Thu Apr 2 23:32:33 2009 New Revision: 761473 URL: http://svn.apache.org/viewvc?rev=761473&view=rev Log: Give Tar more data to work with when autodetecting
Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java Modified: commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java URL: http://svn.apache.org/viewvc/commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java?rev=761473&r1=761472&r2=761473&view=diff ============================================================================== --- commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java (original) +++ commons/proper/compress/trunk/src/main/java/org/apache/commons/compress/archivers/ArchiveStreamFactory.java Thu Apr 2 23:32:33 2009 @@ -131,18 +131,21 @@ in.reset(); if (ZipArchiveInputStream.matches(signature, signatureLength)) { return new ZipArchiveInputStream(in); - } else if (JarArchiveInputStream - .matches(signature, signatureLength)) { + } else if (JarArchiveInputStream.matches(signature, signatureLength)) { return new JarArchiveInputStream(in); - } else if (TarArchiveInputStream - .matches(signature, signatureLength)) { - return new TarArchiveInputStream(in); } else if (ArArchiveInputStream.matches(signature, signatureLength)) { return new ArArchiveInputStream(in); - } else if (CpioArchiveInputStream.matches(signature, - signatureLength)) { + } else if (CpioArchiveInputStream.matches(signature, signatureLength)) { return new CpioArchiveInputStream(in); } + // Tar needs a bigger buffer to check the signature; read the first block + final byte[] tarheader = new byte[512]; + in.mark(tarheader.length); + signatureLength = in.read(tarheader); + in.reset(); + if (TarArchiveInputStream.matches(tarheader, signatureLength)) { + return new TarArchiveInputStream(in); + } } catch (IOException e) { throw new ArchiveException( "Could not use reset and mark operations.", e);