[pacman-dev] [PATCH 2/2] Warn when directory ownership differs between filesystem and package

canyonknight canyonknight at gmail.com
Sun Jul 21 13:31:21 EDT 2013


On Sun, Jul 21, 2013 at 2:21 AM, Allan McRae <allan at archlinux.org> wrote:
> We currently only warn if a directories permissions differ, but using -Qkk

directories -> directory's

> on my system shows that directory permissions tend to change in packages
> reasonably frequently without noitce.  Provide a warning in such cases

noitce -> notice

> 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