diff options
author | David Kalnischkies <david@kalnischkies.de> | 2016-07-22 13:04:47 +0200 |
---|---|---|
committer | David Kalnischkies <david@kalnischkies.de> | 2016-07-22 16:05:09 +0200 |
commit | 01047752b34486607665db99afffa595cb2d43ce (patch) | |
tree | 512f73f84fd29a6bfaea7b98b6f591de5836f4a4 /apt-private/private-sources.cc | |
parent | 503c7d594125f963b92047ad2d9d0644f39136c7 (diff) |
create non-existent files in edit-sources with 644 instead of 640
If the sources file we want to edit doesn't exist yet GetLock will
create it with 640, which for a generic lockfile might be okay, but as
this is a sources file more relaxed permissions are in order – and
actually required as it wont be readable for unprivileged users causing
warnings/errors in apt calls.
Reported-By: J. Theede (musca) on IRC
Diffstat (limited to 'apt-private/private-sources.cc')
-rw-r--r-- | apt-private/private-sources.cc | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/apt-private/private-sources.cc b/apt-private/private-sources.cc index 7e64d5d7f..587571760 100644 --- a/apt-private/private-sources.cc +++ b/apt-private/private-sources.cc @@ -13,6 +13,8 @@ #include <apt-private/private-sources.h> #include <apt-private/private-utils.h> +#include <sys/types.h> +#include <sys/stat.h> #include <stddef.h> #include <unistd.h> #include <iostream> @@ -46,6 +48,12 @@ bool EditSources(CommandLine &CmdL) HashString before; if (FileExists(sourceslist)) before.FromFile(sourceslist); + else + { + FileFd filefd; + if (filefd.Open(sourceslist, FileFd::Create | FileFd::WriteOnly, FileFd::None, 0644) == false) + return false; + } ScopedGetLock lock(sourceslist); if (lock.fd < 0) @@ -56,7 +64,13 @@ bool EditSources(CommandLine &CmdL) do { if (EditFileInSensibleEditor(sourceslist) == false) return false; - if (FileExists(sourceslist) && !before.VerifyFile(sourceslist)) + if (before.empty()) + { + struct stat St; + if (stat(sourceslist.c_str(), &St) == 0 && St.st_size == 0) + RemoveFile("edit-sources", sourceslist); + } + else if (FileExists(sourceslist) && !before.VerifyFile(sourceslist)) { file_changed = true; pkgCacheFile::RemoveCaches(); |