From 7ddf958e370d13f93edc6923bee289b2f6444b41 Mon Sep 17 00:00:00 2001 From: Julian Andres Klode Date: Tue, 30 May 2017 22:24:14 +0200 Subject: Fix parsing of or groups in build-deps with ignored packages If the last alternative(s) of an Or group is ignored, because it does not match an architecture list, we would end up keeping the or flag, effectively making the next AND an OR. For example, when parsing (on amd64): debhelper (>= 9), libnacl-dev [amd64] | libnacl-dev [i386] => debhelper (>= 9), libnacl-dev | Which can cause python-apt to crash. Even worse: debhelper (>= 9), libnacl-dev [amd64] | libnacl-dev [i386], foobar => debhelper (>= 9), libnacl-dev [amd64] | foobar By setting the previous alternatives Or flag to the current Or flag if the current alternative is ignored, we solve the issue. LP: #1694697 --- apt-pkg/deb/debsrcrecords.cc | 12 ++++- ...4697-build-dep-architecture-limited-alternative | 58 ++++++++++++++++++++++ 2 files changed, 69 insertions(+), 1 deletion(-) create mode 100755 test/integration/test-bug-lp1694697-build-dep-architecture-limited-alternative diff --git a/apt-pkg/deb/debsrcrecords.cc b/apt-pkg/deb/debsrcrecords.cc index 5f0a75cd9..d664b609e 100644 --- a/apt-pkg/deb/debsrcrecords.cc +++ b/apt-pkg/deb/debsrcrecords.cc @@ -129,8 +129,18 @@ bool debSrcRecordParser::BuildDepends(std::vectorError("Problem parsing dependency: %s", fields[I]); rec.Type = I; - if (rec.Package != "") + // We parsed a package that was ignored (wrong architecture restriction + // or something). + if (rec.Package == "") { + // If we are in an OR group, we need to set the "Or" flag of the + // previous entry to our value. + if (BuildDeps.size() > 0 && (BuildDeps[BuildDeps.size() - 1].Op & pkgCache::Dep::Or) == pkgCache::Dep::Or) { + BuildDeps[BuildDeps.size() - 1].Op &= ~pkgCache::Dep::Or; + BuildDeps[BuildDeps.size() - 1].Op |= (rec.Op & pkgCache::Dep::Or); + } + } else { BuildDeps.push_back(rec); + } if (Start == Stop) break; diff --git a/test/integration/test-bug-lp1694697-build-dep-architecture-limited-alternative b/test/integration/test-bug-lp1694697-build-dep-architecture-limited-alternative new file mode 100755 index 000000000..7f8e4ad3d --- /dev/null +++ b/test/integration/test-bug-lp1694697-build-dep-architecture-limited-alternative @@ -0,0 +1,58 @@ +#!/bin/sh +set -e + +TESTDIR="$(readlink -f "$(dirname "$0")")" +. "$TESTDIR/framework" + +setupenvironment +configarchitecture 'i386' + + +insertpackage 'stable' 'build-depends' 'i386' '1' +insertpackage 'stable' 'foo' 'i386' '1' +insertinstalledpackage 'build-essential' 'i386' '1' + +setupaptarchive + +# This used to be interpreted as build-depends | foo +cat > foobar.dsc < +Build-Depends: build-depends [i386] | build-depends [amd64], foo +Standards-Version: 3.9.8 +EOF +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + build-depends foo +0 upgraded, 2 newly installed, 0 to remove and 0 not upgraded. +Inst build-depends (1 stable [i386]) +Inst foo (1 stable [i386]) +Conf build-depends (1 stable [i386]) +Conf foo (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc + + +# This caused a segmentation fault +cat > foobar.dsc < +Build-Depends: build-depends [i386] | build-depends [amd64] +Standards-Version: 3.9.8 +EOF +testsuccessequal "Note, using file './foobar.dsc' to get the build dependencies +Reading package lists... +Building dependency tree... +The following NEW packages will be installed: + build-depends +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Inst build-depends (1 stable [i386]) +Conf build-depends (1 stable [i386])" aptget build-dep --simulate ./foobar.dsc -- cgit v1.2.3