[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