Send patches - preferably formatted by git format-patch - to patches at archlinux32 dot org.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan McRae <allan@archlinux.org>2012-05-07 22:21:20 +1000
committerAllan McRae <allan@archlinux.org>2012-12-14 13:45:12 +1000
commit7d27b2b0f425460be5074f50a4233c9db08fe72b (patch)
tree1e90c2f1f3b2d6d743dff3b7ab1806e1c83dcb02
parentddd2b9e6f638fa98d02c6c64e2717b175dcb3ae7 (diff)
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>
-rw-r--r--src/pacman/check.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/src/pacman/check.c b/src/pacman/check.c
index bdf34b42..d661775b 100644
--- a/src/pacman/check.c
+++ b/src/pacman/check.c
@@ -43,6 +43,27 @@ 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))) {
+ if(config->quiet) {
+ printf("%s %s\n", pkgname, filepath);
+ } else {
+ 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 +118,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];
@@ -264,6 +284,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) {