[pacman-dev] [PATCH] Check file types match before comparing properties

Allan McRae allan at archlinux.org
Mon May 7 08:22:15 EDT 2012


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))) {
+		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



More information about the pacman-dev mailing list