You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "Stefan Bodewig (JIRA)" <ji...@apache.org> on 2017/07/19 10:58:00 UTC

[jira] [Comment Edited] (COMPRESS-417) Decompress tar.gz file failed. java.io.Exception:Error detected parsing the header

    [ https://issues.apache.org/jira/browse/COMPRESS-417?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16092928#comment-16092928 ] 

Stefan Bodewig edited comment on COMPRESS-417 at 7/19/17 10:57 AM:
-------------------------------------------------------------------

The problem is inside the tar package as

{code}
public class Untargz {
    public static void main(String[] args) throws Exception {
        final File input = new File(args[0]);
        try (InputStream is = new FileInputStream(input);
             CompressorInputStream in = new GzipCompressorInputStream(is, true);
             OutputStream out = new FileOutputStream("foo.tar")) {
            IOUtils.copy(in, out);
        }
        try (InputStream is = new FileInputStream("foo.tar");
             TarArchiveInputStream tin = new TarArchiveInputStream(is)) {
            TarArchiveEntry entry = tin.getNextTarEntry();
            while (entry != null) {
                File archiveEntry = new File(entry.getName());
                archiveEntry.getParentFile().mkdirs();
                if (entry.isDirectory()) {
                    archiveEntry.mkdir();
                    entry = tin.getNextTarEntry();
                    continue;
                }
                try (OutputStream out = new FileOutputStream(archiveEntry)) {
                    IOUtils.copy(tin, out);
                }
                entry = tin.getNextTarEntry();
            }
        }
    }
}
{code}

fails for me and {{foo.tar}} is a valid archive.


was (Author: bodewig):
The problem is inside the tar package as

{code}
public class Untargz {
    public static void main(String[] args) throws Exception {
        final File input = new File(args[0]);
        try (InputStream is = new FileInputStream(input);
             CompressorInputStream in = new GzipCompressorInputStream(is, true);
             OutputStream out = new FileOutputStream("foo.tar")) {
            IOUtils.copy(in, out);
        }
        try (InputStream is = new FileInputStream("foo.tar");
             TarArchiveInputStream tin = new TarArchiveInputStream(is)) {
            TarArchiveEntry entry = tin.getNextTarEntry();
            while (entry != null) {
                File archiveEntry = new File(entry.getName());
                archiveEntry.getParentFile().mkdirs();
                if (entry.isDirectory()) {
                    archiveEntry.mkdir();
                    entry = tin.getNextTarEntry();
                    continue;
                }
                try (OutputStream out = new FileOutputStream(archiveEntry)) {
                    IOUtils.copy(tin, out);
                }
                entry = tin.getNextTarEntry();
            }
        }
    }
{code}

fails for me and {{foo.tar}} is a valid archive.

> Decompress tar.gz file failed. java.io.Exception:Error detected parsing the header
> ----------------------------------------------------------------------------------
>
>                 Key: COMPRESS-417
>                 URL: https://issues.apache.org/jira/browse/COMPRESS-417
>             Project: Commons Compress
>          Issue Type: Bug
>          Components: Archivers
>    Affects Versions: 1.14
>            Reporter: alphacome
>            Priority: Critical
>         Attachments: 20000102.0000+0800-20000102.0015+0800_0.tar.gz
>
>
> {code:java}
>     public static void deGzipArchive(String filepath,String dir)
>             throws Exception {
>         final File input = new File(filepath);
>         final InputStream is = new FileInputStream(input);
>         final CompressorInputStream in = new GzipCompressorInputStream(is, true);
>         TarArchiveInputStream tin = new TarArchiveInputStream(in);
>         TarArchiveEntry entry = tin.getNextTarEntry();
>         while (entry != null) {
>             File archiveEntry = new File(dir, entry.getName());
>             archiveEntry.getParentFile().mkdirs();
>             if (entry.isDirectory()) {
>                 archiveEntry.mkdir();
>                 entry = tin.getNextTarEntry();
>                 continue;
>             }
>             OutputStream out = new FileOutputStream(archiveEntry);
>             IOUtils.copy(tin, out);
>             out.close();
>             entry = tin.getNextTarEntry();
>         }
>         in.close();
>         tin.close();
>     }
>     public static void main(String[] args) throws Exception {
>         Gztest.deGzipArchive("D:/20000102.0000+0800-20000102.0015+0800_0.tar.gz","D:/");
>     }
> {code}
> the tar.gz file can be decompressed in linux environment use 'tar' command.
> The error log:
> Exception in thread "main" java.io.IOException: Error detected parsing the header
> 	at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:286)
> 	at gztest.deGzipArchive(gztest.java:23)
> 	at gztest.main(gztest.java:149)
> Caused by: java.lang.IllegalArgumentException: Invalid byte 100 at offset 0 in 'dos{NUL}{NUL}{NUL}{NUL}{NUL}' len=8
> 	at org.apache.commons.compress.archivers.tar.TarUtils.parseOctal(TarUtils.java:141)
> 	at org.apache.commons.compress.archivers.tar.TarUtils.parseOctalOrBinary(TarUtils.java:171)
> 	at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:1128)
> 	at org.apache.commons.compress.archivers.tar.TarArchiveEntry.parseTarHeader(TarArchiveEntry.java:1091)
> 	at org.apache.commons.compress.archivers.tar.TarArchiveEntry.<init>(TarArchiveEntry.java:368)
> 	at org.apache.commons.compress.archivers.tar.TarArchiveInputStream.getNextTarEntry(TarArchiveInputStream.java:284)
> 	... 2 more
> 	



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)