[pacman-dev] [PATCH] Check file types match before comparing properties
Allan McRae
allan at archlinux.org
Mon May 7 08:54:34 EDT 2012
On 07/05/12 22:22, Allan McRae wrote:
> Bail early in file validation checks if the file type given in the
> mtree file does not match that in the filesystem.
>
> Signed-off-by: Allan McRae <allan at archlinux.org>
> ---
> src/pacman/check.c | 23 ++++++++++++++++++++++-
> 1 file changed, 22 insertions(+), 1 deletion(-)
>
> diff --git a/src/pacman/check.c b/src/pacman/check.c
> index e9ccdc8..229776e 100644
> --- a/src/pacman/check.c
> +++ b/src/pacman/check.c
> @@ -43,6 +43,23 @@ static int check_file_exists(const char *pkgname, const char * filepath,
> return 0;
> }
>
> +static int check_file_type(const char *pkgname, const char *filepath,
> + struct stat *st, struct archive_entry *entry)
> +{
> + mode_t archive_type = archive_entry_filetype(entry);
> + mode_t file_type = st->st_mode;
> +
> + if((archive_type == AE_IFREG && !S_ISREG(file_type)) ||
> + (archive_type == AE_IFDIR && !S_ISDIR(file_type)) ||
> + (archive_type == AE_IFLNK && !S_ISLNK(file_type))) {
I realised that this does not quieten output when used with -Qqkk.
Fixed on my working branch.
> + pm_printf(ALPM_LOG_WARNING, "%s: %s (File type mismatch)\n",
> + pkgname, filepath);
> + return 1;
> + }
> +
> + return 0;
> +}
> +
> static int check_file_permissions(const char *pkgname, const char *filepath,
> struct stat *st, struct archive_entry *entry)
> {
> @@ -97,7 +114,6 @@ static int check_file_time(const char *pkgname, const char *filepath,
> static int check_file_link(const char *pkgname, const char *filepath,
> struct stat *st, struct archive_entry *entry)
> {
> - /* TODO - fail early if file is not a symlink */
> size_t length = st->st_size + 1;
> char link[length];
>
> @@ -257,6 +273,11 @@ int check_pkg_full(alpm_pkg_t *pkg)
> continue;
> }
>
> + if(check_file_type(pkgname, filepath, &st, entry) == 1) {
> + errors++;
> + continue;
> + }
> +
> file_errors += check_file_permissions(pkgname, filepath, &st, entry);
>
> if(type != AE_IFDIR) {
More information about the pacman-dev
mailing list