From 1885cbd6a255cddf5094db1d3414a247c450f215 Mon Sep 17 00:00:00 2001 From: Harald Sitter Date: Tue, 31 Oct 2017 11:36:31 +0100 Subject: [PATCH] make deb reader handle new control.tar options introduced in dpkg 1.17.6 newly supported is uncompressed control.tar and xz compressed control.tar.xz. latter is used by ubuntu for dbgsym ddebs. Fixes #655 --- deb/deb.go | 39 ++++++++++++++---- deb/deb_test.go | 11 ++++- ....9.1+dfsg-2+18.04+bionic+build4_amd64.ddeb | Bin 0 -> 972 bytes 3 files changed, 42 insertions(+), 8 deletions(-) create mode 100644 system/changes/libqt5concurrent5-dbgsym_5.9.1+dfsg-2+18.04+bionic+build4_amd64.ddeb diff --git a/deb/deb.go b/deb/deb.go index 26db3a1df0..929407c4e6 100644 --- a/deb/deb.go +++ b/deb/deb.go @@ -37,21 +37,46 @@ func GetControlFileFromDeb(packageFile string) (Stanza, error) { library := ar.NewReader(file) for { header, err := library.Next() + if err == io.EOF { - return nil, fmt.Errorf("unable to find control.tar.gz part in package %s", packageFile) + return nil, fmt.Errorf("unable to find control.tar.* part in package %s", packageFile) } if err != nil { return nil, fmt.Errorf("unable to read .deb archive %s: %s", packageFile, err) } - if header.Name == "control.tar.gz" { - ungzip, err := gzip.NewReader(library) - if err != nil { - return nil, fmt.Errorf("unable to ungzip control file from %s. Error: %s", packageFile, err) + // As per deb(5) version 1.19.0.4 the control file may be: + // - control.tar (since 1.17.6) + // - control.tar.gz + // - control.tar.xz (since 1.17.6) + // Look for all of the above and uncompress as necessary. + if strings.HasPrefix(header.Name, "control.tar") { + bufReader := bufio.NewReader(library) + + var tarInput io.Reader + + switch header.Name { + case "control.tar": + tarInput = bufReader + case "control.tar.gz": + ungzip, err := gzip.NewReader(bufReader) + if err != nil { + return nil, errors.Wrapf(err, "unable to ungzip %s from %s", header.Name, packageFile) + } + defer ungzip.Close() + tarInput = ungzip + case "control.tar.xz": + unxz, err := xz.NewReader(bufReader) + if err != nil { + return nil, errors.Wrapf(err, "unable to unxz %s from %s", header.Name, packageFile) + } + defer unxz.Close() + tarInput = unxz + default: + return nil, fmt.Errorf("unsupported tar compression in %s: %s", packageFile, header.Name) } - defer ungzip.Close() - untar := tar.NewReader(ungzip) + untar := tar.NewReader(tarInput) for { tarHeader, err := untar.Next() if err == io.EOF { diff --git a/deb/deb_test.go b/deb/deb_test.go index 9ffd74c75c..d2d6dd38dc 100644 --- a/deb/deb_test.go +++ b/deb/deb_test.go @@ -11,7 +11,7 @@ import ( ) type DebSuite struct { - debFile, debFile2, dscFile, dscFileNoSign string + debFile, debFile2, debFileWithXzControl, dscFile, dscFileNoSign string } var _ = Suite(&DebSuite{}) @@ -20,6 +20,7 @@ func (s *DebSuite) SetUpSuite(c *C) { _, _File, _, _ := runtime.Caller(0) s.debFile = filepath.Join(filepath.Dir(_File), "../system/files/libboost-program-options-dev_1.49.0.1_i386.deb") s.debFile2 = filepath.Join(filepath.Dir(_File), "../system/changes/hardlink_0.2.1_amd64.deb") + s.debFileWithXzControl = filepath.Join(filepath.Dir(_File), "../system/changes/libqt5concurrent5-dbgsym_5.9.1+dfsg-2+18.04+bionic+build4_amd64.ddeb") s.dscFile = filepath.Join(filepath.Dir(_File), "../system/files/pyspi_0.6.1-1.3.dsc") s.dscFileNoSign = filepath.Join(filepath.Dir(_File), "../system/files/pyspi-0.6.1-1.3.stripped.dsc") } @@ -38,6 +39,14 @@ func (s *DebSuite) TestGetControlFileFromDeb(c *C) { c.Check(st["Package"], Equals, "libboost-program-options-dev") } +func (s *DebSuite) TestGetControlFileFromDebWithXzControl(c *C) { + // Has control.tar.xz archive inside. + st, err := GetControlFileFromDeb(s.debFileWithXzControl) + c.Check(err, IsNil) + c.Check(st["Version"], Equals, "5.9.1+dfsg-2+18.04+bionic+build4") + c.Check(st["Package"], Equals, "libqt5concurrent5-dbgsym") +} + func (s *DebSuite) TestGetControlFileFromDsc(c *C) { verifier := &pgp.GoVerifier{} diff --git a/system/changes/libqt5concurrent5-dbgsym_5.9.1+dfsg-2+18.04+bionic+build4_amd64.ddeb b/system/changes/libqt5concurrent5-dbgsym_5.9.1+dfsg-2+18.04+bionic+build4_amd64.ddeb new file mode 100644 index 0000000000000000000000000000000000000000..77d6946acc0d907373657bf2d497253a3eb463df GIT binary patch literal 972 zcmY$iNi0gvu;WTeP0CEn(@o0EODw8XP*5;5HLx@>F}5@@P*4COAb^mD1_ov(CJG8b z1O*9PMtTNZ$@zIDMfo{;C5c6P6;*`wn;AgNQ&33Y`fFYl5yim3^6c6cHzo!}Mll8k zh7$d!iyx@}XA+HN5a-?_Q_DE@fUK9>9GN5k^>)vF7~g&2isF}lJl`d2@2)>`;MT#j zZ7x5jwmY-DHF`8>`sE*s7bx-_xUv5t&qTu$bs}np7vBo*sh`o!6kDmOd~=%Nn)ACn zzVBG|WaT@nS$}%dBB^JeOu5~cYP6Ky_K<+4T$ayn(_hQ%SsI!DCjHx`b2K8P&a<`b;?#LJYnFSq zZ!+$YS-r*in9mEIK=wy-I{c5ePg0SRlW&>xIHxbyYg32PmoK@O?(ydc?9lzQbGECR znySE~v%fyx3Xp!X_>jlvV_|nJd%m77{B~S@&9z>u6YDLWm{@c6qGpMoYSambx;VemW96z>|AzRv(6dy^k2ZGZGzduCpDpP57H>EoQ= zGvB`a;ZoV1{(sNJZ(47RBsta8&Q7sqy0J<}S(0CJ(j2l@R0vH(Fw3el9Jd*yK2_(r98I_V)k_bq-l5 z3Vf1tBy#1+^Oufa^bM^&ec3pnXuq4>S^e