[pacman-dev] [PATCH 2/2] Warn when directory ownership differs between filesystem and package
Allan McRae
allan at archlinux.org
Sun Jul 21 02:21:26 EDT 2013
We currently only warn if a directories permissions differ, but using -Qkk
on my system shows that directory permissions tend to change in packages
reasonably frequently without noitce. Provide a warning in such cases
so that it can be altered. Example output:
(1/1) reinstalling nginx
warning: directory ownership differs on /var/lib/nginx/proxy/
filesystem: 33:0 package: 0:0
Signed-off-by: Allan McRae <allan at archlinux.org>
---
lib/libalpm/add.c | 16 +++++++++++++++-
src/pacman/check.c | 18 ++++++++++++------
2 files changed, 27 insertions(+), 7 deletions(-)
diff --git a/lib/libalpm/add.c b/lib/libalpm/add.c
index df39274..ac4e36a 100644
--- a/lib/libalpm/add.c
+++ b/lib/libalpm/add.c
@@ -215,18 +215,32 @@ static int extract_single_file(alpm_handle_t *handle, struct archive *archive,
} else {
if(S_ISDIR(lsbuf.st_mode)) {
if(S_ISDIR(entrymode)) {
+ uid_t entryuid = archive_entry_uid(entry);
+ gid_t entrygid = archive_entry_gid(entry);
+
/* case 6: existing dir, ignore it */
if(lsbuf.st_mode != entrymode) {
/* if filesystem perms are different than pkg perms, warn user */
mode_t mask = 07777;
_alpm_log(handle, ALPM_LOG_WARNING, _("directory permissions differ on %s\n"
- "filesystem: %o package: %o\n"), filename, lsbuf.st_mode & mask,
+ "filesystem: %o package: %o\n"), filename, lsbuf.st_mode & mask,
entrymode & mask);
alpm_logaction(handle, ALPM_CALLER_PREFIX,
"warning: directory permissions differ on %s\n"
"filesystem: %o package: %o\n", filename, lsbuf.st_mode & mask,
entrymode & mask);
}
+
+ if((entryuid != lsbuf.st_uid) || (entrygid != lsbuf.st_gid)) {
+ _alpm_log(handle, ALPM_LOG_WARNING, _("directory ownership differs on %s\n"
+ "filesystem: %u:%u package: %u:%u\n"), filename,
+ lsbuf.st_uid, lsbuf.st_gid, entryuid, entrygid);
+ alpm_logaction(handle, ALPM_CALLER_PREFIX,
+ "warning: directory ownership differs on %s\n"
+ "filesystem: %u:%u package: %u:%u\n", filename,
+ lsbuf.st_uid, lsbuf.st_gid, entryuid, entrygid);
+ }
+
_alpm_log(handle, ALPM_LOG_DEBUG, "extract: skipping dir extraction of %s\n",
filename);
archive_read_data_skip(archive);
diff --git a/src/pacman/check.c b/src/pacman/check.c
index cdd3744..6c8889f 100644
--- a/src/pacman/check.c
+++ b/src/pacman/check.c
@@ -106,9 +106,12 @@ static int check_file_time(const char *pkgname, const char *filepath,
{
if(st->st_mtime != archive_entry_mtime(entry)) {
if(backup) {
- printf("%s%s%s: ", config->colstr.title, _("backup file"), config->colstr.nocolor);
- printf(_("%s: %s (Modification time mismatch)\n"),
- pkgname, filepath);
+ if(!config->quiet) {
+ printf("%s%s%s: ", config->colstr.title, _("backup file"),
+ config->colstr.nocolor);
+ printf(_("%s: %s (Modification time mismatch)\n"),
+ pkgname, filepath);
+ }
return 0;
}
if(!config->quiet) {
@@ -150,9 +153,12 @@ static int check_file_size(const char *pkgname, const char *filepath,
{
if(st->st_size != archive_entry_size(entry)) {
if(backup) {
- printf("%s%s%s: ", config->colstr.title, _("backup file"), config->colstr.nocolor);
- printf(_("%s: %s (Size mismatch)\n"),
- pkgname, filepath);
+ if(!config->quiet) {
+ printf("%s%s%s: ", config->colstr.title, _("backup file"),
+ config->colstr.nocolor);
+ printf(_("%s: %s (Size mismatch)\n"),
+ pkgname, filepath);
+ }
return 0;
}
if(!config->quiet) {
--
1.8.3.3
More information about the pacman-dev
mailing list