From e81faa9d6d2ac910720a9a87a9f469b80cf106e5 Mon Sep 17 00:00:00 2001 From: Allan McRae Date: Sun, 21 Jul 2013 16:10:25 +1000 Subject: Warn when directory ownership differs between filesystem and package We currently only warn if a directory's permissions differ, but using -Qkk on my system shows that directory permissions tend to change in packages reasonably frequently without notice. 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 --- 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 8ef9ef0e..45c57b05 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 cdd3744b..6c8889fc 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) { -- cgit v1.2.3-24-g4f1b