[pacman-dev] [PATCH] Check file types match before comparing properties
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@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))) { + 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) { -- 1.7.10.1
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@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) {
participants (1)
-
Allan McRae