diff --git a/Gomfile b/Gomfile index e736a475..929235a6 100644 --- a/Gomfile +++ b/Gomfile @@ -5,6 +5,7 @@ gom 'github.com/cheggaaa/pb', :commit => '2c1b74620cc58a81ac152ee2d322e28c806d81 gom 'github.com/DisposaBoy/JsonConfigReader', :commit => '33a99fdf1d5ee1f79b5077e9c06f955ad356d5f4' gom 'github.com/gin-gonic/gin', :commit => 'b1758d3bfa09e61ddbc1c9a627e936eec6a170de' gom 'github.com/go-ini/ini', :commit => 'afbd495e5aaea13597b5e14fe514ddeaa4d76fc3' +gom 'github.com/h2non/filetype/matchers', :commit => '259d9d2c52bc90dbd7e1999f9da86ee0d104d0ff' gom 'github.com/jlaffaye/ftp', :commit => 'fec71e62e457557fbe85cefc847a048d57815d76' gom 'github.com/jmespath/go-jmespath', :commit => '0b12d6b521d83fc7f755e7cfc1b1fbdd35a01a74' gom 'github.com/julienschmidt/httprouter', :commit => '46807412fe50aaceb73bb57061c2230fd26a1640' diff --git a/deb/deb.go b/deb/deb.go index 3a97468f..50c7b7cb 100644 --- a/deb/deb.go +++ b/deb/deb.go @@ -2,16 +2,20 @@ package deb import ( "archive/tar" + "bufio" "compress/bzip2" "compress/gzip" "fmt" - "github.com/mkrautz/goar" - "github.com/smira/aptly/utils" - "github.com/smira/go-xz" - "github.com/smira/lzma" "io" "os" "strings" + + "github.com/h2non/filetype/matchers" + "github.com/mkrautz/goar" + + "github.com/smira/aptly/utils" + "github.com/smira/go-xz" + "github.com/smira/lzma" ) // GetControlFileFromDeb reads control file from deb package @@ -119,29 +123,41 @@ func GetContentsFromDeb(packageFile string) ([]string, error) { } if strings.HasPrefix(header.Name, "data.tar") { + bufReader := bufio.NewReader(library) + signature, err := bufReader.Peek(270) + + var isTar bool + if err == nil { + isTar = matchers.Tar(signature) + } + var tarInput io.Reader switch header.Name { case "data.tar": - tarInput = library + tarInput = bufReader case "data.tar.gz": - ungzip, err := gzip.NewReader(library) - if err != nil { - return nil, fmt.Errorf("unable to ungzip data.tar.gz from %s: %s", packageFile, err) + if isTar { + tarInput = bufReader + } else { + ungzip, err := gzip.NewReader(bufReader) + if err != nil { + return nil, fmt.Errorf("unable to ungzip data.tar.gz from %s: %s", packageFile, err) + } + defer ungzip.Close() + tarInput = ungzip } - defer ungzip.Close() - tarInput = ungzip case "data.tar.bz2": - tarInput = bzip2.NewReader(library) + tarInput = bzip2.NewReader(bufReader) case "data.tar.xz": - unxz, err := xz.NewReader(library) + unxz, err := xz.NewReader(bufReader) if err != nil { return nil, fmt.Errorf("unable to unxz data.tar.xz from %s: %s", packageFile, err) } defer unxz.Close() tarInput = unxz case "data.tar.lzma": - unlzma := lzma.NewReader(library) + unlzma := lzma.NewReader(bufReader) defer unlzma.Close() tarInput = unlzma default: