summaryrefslogtreecommitdiff
path: root/apt-pkg/deb/debsystem.cc
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2016-08-13 15:55:52 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2016-08-17 07:55:46 +0200
commit5586b8882fda5f099d65a91f362c14c9d7e1b4ac (patch)
treee0a87a056d0b5829fac4fa8d9704ecbdaf22ba46 /apt-pkg/deb/debsystem.cc
parent77e274f5ad23d79294f28ecc9868fc6f534214a4 (diff)
default to Dir=/ in dpkg/status file finding magic
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
Diffstat (limited to 'apt-pkg/deb/debsystem.cc')
-rw-r--r--apt-pkg/deb/debsystem.cc22
1 files changed, 10 insertions, 12 deletions
diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc
index fd702b3c6..f7968ec47 100644
--- a/apt-pkg/deb/debsystem.cc
+++ b/apt-pkg/deb/debsystem.cc
@@ -184,26 +184,24 @@ pkgPackageManager *debSystem::CreatePM(pkgDepCache *Cache) const
// 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/");
+ // 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())
- Cnf.Set("Dir::State", "var/lib/dpkg");
+ PathCnf.Set("Dir::State", "var/lib/dpkg");
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)
{