Package: apt Version: 1.0.9.6 Tags: patch User: helm...@debian.org Usertags: rebootstrap
Consider a system with native architecture amd64 and foreign architecture i386. Then consider the following empty packages (generateable with equivs): Package: foo Architecture: all Provides: bar:i386 Package: baz Architecture: i386 Depends: bar With dpkg, baz can be installed without complaint. Then, apt-get check loudly complains that baz' dependency on bar is not satisfied. The underlying problem is that libapt-pkg does not correctly parse these provides. Internally, it creates a version named "baz:i386" with architecture amd64. Of course, such a package name is invalid and thus this version is completely inaccessible. Thus, this bug should not cause apt to accept a broken situation as valid. Nevertheless, it prevents using architecture qualified depends. The attached patch fixes the parsing problem. After upgrading to a patched apt and running apt-get --no-download update, apt-get check no longer complains. If the patch looks good, it would be useful (for rebootstrap) to have this fixed in some suite (presumably experimental) soon. Helmut
diff -Nru apt-1.0.9.6/apt-pkg/deb/deblistparser.cc apt-1.0.9.6+nmu1/apt-pkg/deb/deblistparser.cc --- apt-1.0.9.6/apt-pkg/deb/deblistparser.cc +++ apt-1.0.9.6+nmu1/apt-pkg/deb/deblistparser.cc @@ -817,10 +817,16 @@ while (1) { Start = ParseDepends(Start,Stop,Package,Version,Op); + const size_t archfound = Package.rfind(':'); if (Start == 0) return _error->Error("Problem parsing Provides line"); if (Op != pkgCache::Dep::NoOp && Op != pkgCache::Dep::Equals) { _error->Warning("Ignoring Provides line with non-equal DepCompareOp for package %s", Package.c_str()); + } else if (archfound != string::npos) { + string OtherArch = Package.substr(archfound+1, string::npos); + Package = Package.substr(0, archfound); + if (NewProvides(Ver, Package, OtherArch, Version) == false) + return false; } else if ((Ver->MultiArch & pkgCache::Version::Foreign) == pkgCache::Version::Foreign) { if (NewProvidesAllArch(Ver, Package, Version) == false) return false; diff -Nru apt-1.0.9.6/debian/changelog apt-1.0.9.6+nmu1/debian/changelog --- apt-1.0.9.6/debian/changelog +++ apt-1.0.9.6+nmu1/debian/changelog @@ -1,3 +1,10 @@ +apt (1.0.9.6+nmu1) UNRELEASED; urgency=low + + * Non-maintainer upload. + * Parse architecture qualified Provides (Closes: #-1) + + -- Helmut Grohne <hel...@subdivi.de> Tue, 03 Feb 2015 20:37:34 +0100 + apt (1.0.9.6) unstable; urgency=medium [ Michael Vogt ]