From 38d444af2632219ab399dabadaaefaa4dcdd6ebf Mon Sep 17 00:00:00 2001 From: David Kalnischkies Date: Fri, 19 Jan 2018 02:20:40 +0100 Subject: allow the apt/lists/auxfiles/ directory to be missing apt 1.6~alpha6 introduced aux requests to revamp the implementation of a-t-mirror. This already included the potential of running as non-root, but the detection wasn't complete resulting in errors or could produce spurious warnings along the way if the directory didn't exist yet. References: ef9677831f62a1554a888ebc7b162517d7881116 Closes: 887624 --- apt-pkg/acquire-item.cc | 2 +- apt-pkg/acquire.cc | 52 +++++++++++++++++++++++++++++++++---------------- 2 files changed, 36 insertions(+), 18 deletions(-) (limited to 'apt-pkg') diff --git a/apt-pkg/acquire-item.cc b/apt-pkg/acquire-item.cc index 7fcc5867a..792465b90 100644 --- a/apt-pkg/acquire-item.cc +++ b/apt-pkg/acquire-item.cc @@ -3979,7 +3979,7 @@ static std::string GetAuxFileNameFromURIInLists(std::string const &uri) std::string const tmpfile_tpl = flCombine(dirname, filetag); std::unique_ptr tmpfile { strdup(tmpfile_tpl.c_str()), std::free }; int const fd = mkstemp(tmpfile.get()); - if (fd == -1 && errno == EACCES) + if (fd == -1) return ""; RemoveFile("GetAuxFileNameFromURI", tmpfile.get()); close(fd); diff --git a/apt-pkg/acquire.cc b/apt-pkg/acquire.cc index d964171a6..ba895ed44 100644 --- a/apt-pkg/acquire.cc +++ b/apt-pkg/acquire.cc @@ -81,27 +81,41 @@ void pkgAcquire::Initialize() static bool SetupAPTPartialDirectory(std::string const &grand, std::string const &parent, std::string const &postfix, mode_t const mode) { std::string const partial = parent + postfix; - mode_t const old_umask = umask(S_IWGRP | S_IWOTH); - bool const creation_fail = (CreateAPTDirectoryIfNeeded(grand, partial) == false && - CreateAPTDirectoryIfNeeded(parent, partial) == false); - umask(old_umask); - if (creation_fail == true) - return false; + bool const partialExists = DirectoryExists(partial); + if (partialExists == false) + { + mode_t const old_umask = umask(S_IWGRP | S_IWOTH); + bool const creation_fail = (CreateAPTDirectoryIfNeeded(grand, partial) == false && + CreateAPTDirectoryIfNeeded(parent, partial) == false); + umask(old_umask); + if (creation_fail == true) + return false; + } std::string const SandboxUser = _config->Find("APT::Sandbox::User"); - if (getuid() == 0 && SandboxUser.empty() == false && SandboxUser != "root") // if we aren't root, we can't chown, so don't try it + if (getuid() == 0) { - struct passwd const * const pw = getpwnam(SandboxUser.c_str()); - struct group const * const gr = getgrnam(ROOT_GROUP); - if (pw != NULL && gr != NULL) + if (SandboxUser.empty() == false && SandboxUser != "root") // if we aren't root, we can't chown, so don't try it { - // chown the partial dir - if(chown(partial.c_str(), pw->pw_uid, gr->gr_gid) != 0) - _error->WarningE("SetupAPTPartialDirectory", "chown to %s:root of directory %s failed", SandboxUser.c_str(), partial.c_str()); + struct passwd const * const pw = getpwnam(SandboxUser.c_str()); + struct group const * const gr = getgrnam(ROOT_GROUP); + if (pw != NULL && gr != NULL) + { + // chown the partial dir + if(chown(partial.c_str(), pw->pw_uid, gr->gr_gid) != 0) + _error->WarningE("SetupAPTPartialDirectory", "chown to %s:root of directory %s failed", SandboxUser.c_str(), partial.c_str()); + } } + if (chmod(partial.c_str(), mode) != 0) + _error->WarningE("SetupAPTPartialDirectory", "chmod 0700 of directory %s failed", partial.c_str()); + + } + else if (chmod(partial.c_str(), mode) != 0) + { + // if we haven't created the dir and aren't root, it is kinda expected that chmod doesn't work + if (partialExists == false) + _error->WarningE("SetupAPTPartialDirectory", "chmod 0700 of directory %s failed", partial.c_str()); } - if (chmod(partial.c_str(), mode) != 0) - _error->WarningE("SetupAPTPartialDirectory", "chmod 0700 of directory %s failed", partial.c_str()); _error->PushToStack(); // remove 'old' FAILED files to stop us from collecting them for no reason @@ -120,7 +134,9 @@ bool pkgAcquire::Setup(pkgAcquireStatus *Progress, string const &Lock) if (SetupAPTPartialDirectory(_config->FindDir("Dir::State"), listDir, "partial", 0700) == false) return _error->Errno("Acquire", _("List directory %s is missing."), (listDir + "partial").c_str()); if (SetupAPTPartialDirectory(_config->FindDir("Dir::State"), listDir, "auxfiles", 0755) == false) - return _error->Errno("Acquire", _("List directory %s is missing."), (listDir + "auxfiles").c_str()); + { + // not being able to create lists/auxfiles isn't critical as we will use a tmpdir then + } string const archivesDir = _config->FindDir("Dir::Cache::Archives"); if (SetupAPTPartialDirectory(_config->FindDir("Dir::Cache"), archivesDir, "partial", 0700) == false) return _error->Errno("Acquire", _("Archives directory %s is missing."), (archivesDir + "partial").c_str()); @@ -150,7 +166,9 @@ bool pkgAcquire::GetLock(std::string const &Lock) if (Lock == listDir || Lock == archivesDir) { if (SetupAPTPartialDirectory(_config->FindDir("Dir::State"), listDir, "auxfiles", 0755) == false) - return _error->Errno("Acquire", _("List directory %s is missing."), (listDir + "auxfiles").c_str()); + { + // not being able to create lists/auxfiles isn't critical as we will use a tmpdir then + } } if (_config->FindB("Debug::NoLocking", false) == true) -- cgit v1.2.3