]> git.saurik.com Git - apt.git/commitdiff
default to Dir=/ in dpkg/status file finding magic
authorDavid Kalnischkies <david@kalnischkies.de>
Sat, 13 Aug 2016 13:55:52 +0000 (15:55 +0200)
committerDavid Kalnischkies <david@kalnischkies.de>
Wed, 17 Aug 2016 05:55:46 +0000 (07:55 +0200)
Seen in cme #833656 if Dir isn't set (yet) we end up later absoluting a
path which was supposed to be absolute already, so if Dir is empty we
assume it to be '/' instead. In practice this is a bug in the software
using libapt, but for maxium compatibility lets explicitly set the
default value here to be safe.

Reported-By: Paul Wise <pabs@debian.org>
Inspired-By: Brendan O'Dea <bod@debian.org>
Fixes-Regression: 475f75506db48a7fa90711fce4ed129f6a14cc9a
Shadows-Bug: #833656

apt-pkg/deb/debsystem.cc

index fd702b3c6b340b05f1feed02abe2c3742474ae1d..f7968ec4780ef9981f5f9f94429fbfe7b151e0fb 100644 (file)
@@ -184,26 +184,24 @@ pkgPackageManager *debSystem::CreatePM(pkgDepCache *Cache) const
 // System::Initialize - Setup the configuration space..                        /*{{{*/
 // ---------------------------------------------------------------------
 /* These are the Debian specific configuration variables.. */
 // System::Initialize - Setup the configuration space..                        /*{{{*/
 // ---------------------------------------------------------------------
 /* These are the Debian specific configuration variables.. */
-static std::string getDpkgStatusLocation(Configuration &Cnf) {
+static std::string getDpkgStatusLocation(Configuration const &Cnf) {
+   Configuration PathCnf;
+   PathCnf.Set("Dir", Cnf.Find("Dir", "/"));
+   PathCnf.Set("Dir::State::status", "status");
    auto const cnfstatedir = Cnf.Find("Dir::State", "var/lib/apt/");
    auto const cnfstatedir = Cnf.Find("Dir::State", "var/lib/apt/");
+   // if the state dir ends in apt, replace it with dpkg -
+   // for the default this gives us the same as the fallback below.
+   // This can't be a ../dpkg as that would play bad with symlinks
    std::string statedir;
    if (APT::String::Endswith(cnfstatedir, "/apt/"))
       statedir.assign(cnfstatedir, 0, cnfstatedir.length() - 5);
    else if (APT::String::Endswith(cnfstatedir, "/apt"))
       statedir.assign(cnfstatedir, 0, cnfstatedir.length() - 4);
    if (statedir.empty())
    std::string statedir;
    if (APT::String::Endswith(cnfstatedir, "/apt/"))
       statedir.assign(cnfstatedir, 0, cnfstatedir.length() - 5);
    else if (APT::String::Endswith(cnfstatedir, "/apt"))
       statedir.assign(cnfstatedir, 0, cnfstatedir.length() - 4);
    if (statedir.empty())
-      Cnf.Set("Dir::State", "var/lib/dpkg");
+      PathCnf.Set("Dir::State", "var/lib/dpkg");
    else
    else
-      Cnf.Set("Dir::State", flCombine(statedir, "dpkg"));
-   auto const cnfrootdir = Cnf.Find("RootDir");
-   if (Cnf.Exists("RootDir") == true)
-      Cnf.Set("RootDir", "");
-   Cnf.Set("Dir::State::status", "status");
-   auto const statusfile = Cnf.FindFile("Dir::State::status");
-   if (cnfrootdir.empty() == false)
-      Cnf.Set("RootDir", cnfrootdir);
-   Cnf.Set("Dir::State", cnfstatedir);
-   return statusfile;
+      PathCnf.Set("Dir::State", flCombine(statedir, "dpkg"));
+   return PathCnf.FindFile("Dir::State::status");
 }
 bool debSystem::Initialize(Configuration &Cnf)
 {
 }
 bool debSystem::Initialize(Configuration &Cnf)
 {