summaryrefslogtreecommitdiff
path: root/apt-pkg/deb
diff options
context:
space:
mode:
authorDavid Kalnischkies <david@kalnischkies.de>2022-09-01 15:14:52 +0200
committerDavid Kalnischkies <david@kalnischkies.de>2022-09-02 16:55:45 +0200
commitf52c1ce9b31befb71016a20759b96b4946034fcb (patch)
tree62d556e84db4489a4276ee7c6b41a8aa26f1c048 /apt-pkg/deb
parent3498fbedafbf30e5c91deeaefa6a60d1e387593a (diff)
Allow apt to run if no dpkg/status file exists
Not having a dpkg/status file used to be a hard error which from a boostrap perspective is suspect as in the beginning, there is no status so you would need to touch it into existence. We make a difference between factual non-existence and inaccessibility to catch mistakes in which the file is not readable for some reason, the testcase test-bug-254770-segfault-if-cache-not-buildable is an example of this. Note that apt has already figured out at this point that this is a Debian-like system which should have a dpkg/status file. This change does not effect the auto-detection and is not supposed to.
Diffstat (limited to 'apt-pkg/deb')
-rw-r--r--apt-pkg/deb/debsystem.cc7
1 files changed, 7 insertions, 0 deletions
diff --git a/apt-pkg/deb/debsystem.cc b/apt-pkg/deb/debsystem.cc
index 65a27f72f..9c55e0a6e 100644
--- a/apt-pkg/deb/debsystem.cc
+++ b/apt-pkg/deb/debsystem.cc
@@ -338,6 +338,13 @@ bool debSystem::AddStatusFiles(std::vector<pkgIndexFile *> &List)
if (d->StatusFile == nullptr)
{
auto dpkgstatus = _config->FindFile("Dir::State::status");
+ if (dpkgstatus.empty())
+ return true;
+ // we ignore only if the file doesn't exist, not if it is inaccessible
+ // e.g. due to permissions on parent directories as FileExists would do
+ errno = 0;
+ if (access(dpkgstatus.c_str(), R_OK) != 0 && errno == ENOENT)
+ return true;
_error->PushToStack();
d->StatusFile = new debStatusIndex(std::move(dpkgstatus));
bool const errored = _error->PendingError();