summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorAllan McRae <allan@archlinux.org>2012-05-07 14:21:20 +0200
committerAllan McRae <allan@archlinux.org>2012-12-14 04:45:12 +0100
commit7d27b2b0f425460be5074f50a4233c9db08fe72b (patch)
tree1e90c2f1f3b2d6d743dff3b7ab1806e1c83dcb02 /src
parentddd2b9e6f638fa98d02c6c64e2717b175dcb3ae7 (diff)
downloadpacman-7d27b2b0f425460be5074f50a4233c9db08fe72b.tar.gz
pacman-7d27b2b0f425460be5074f50a4233c9db08fe72b.tar.xz
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>
Diffstat (limited to 'src')
-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) {