From 27c802fed000bd0a93a98ec6947fb1f6dc435377 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Mon, 4 Feb 2019 18:08:32 +0100 Subject: [PATCH] Cleanup/fix order of toc entries - Make sure we always sort the list when reading it from a package - Cleanup and clarify order of elements Signed-off-by: David Oberhollenzer --- lib/filelist/image_entry_sort.c | 42 ++++++++++++++++++++------------- main/pkg_unpack.c | 2 -- main/pkgio_rd_image_entry.c | 2 +- 3 files changed, 27 insertions(+), 19 deletions(-) diff --git a/lib/filelist/image_entry_sort.c b/lib/filelist/image_entry_sort.c index b056e93..152320a 100644 --- a/lib/filelist/image_entry_sort.c +++ b/lib/filelist/image_entry_sort.c @@ -5,28 +5,38 @@ static int compare_ent(image_entry_t *a, image_entry_t *b) { - if (S_ISDIR(a->mode)) { + /* directories < .. < symlinks < devices < .. < files */ + switch (a->mode & S_IFMT) { + case S_IFDIR: if (S_ISDIR(b->mode)) goto out_len; return -1; + case S_IFREG: + if (S_ISREG(b->mode)) + goto out_fsize; + return 1; + case S_IFLNK: + if (S_ISLNK(b->mode)) + goto out_len; + if (S_ISDIR(b->mode)) + return 1; + return -1; + case S_IFBLK: + case S_IFCHR: + if (S_ISDIR(b->mode) || S_ISLNK(b->mode)) + return 1; + if (S_ISBLK(b->mode) || S_ISCHR(b->mode)) + goto out_len; + return -1; } - if (S_ISDIR(b->mode)) - return 1; - - if (S_ISREG(a->mode)) { - if (S_ISREG(b->mode)) { - if (a->data.file.size > b->data.file.size) - return 1; - if (a->data.file.size < b->data.file.size) - return -1; - return 0; - } - return 1; - } - if (S_ISREG(b->mode)) - return 1; out_len: return (int)strlen(a->name) - (int)strlen(b->name); +out_fsize: + if (a->data.file.size > b->data.file.size) + return 1; + if (a->data.file.size < b->data.file.size) + return -1; + return 0; } static image_entry_t *insert_sorted(image_entry_t *list, image_entry_t *ent) diff --git a/main/pkg_unpack.c b/main/pkg_unpack.c index cbfba55..d7604af 100644 --- a/main/pkg_unpack.c +++ b/main/pkg_unpack.c @@ -202,8 +202,6 @@ int pkg_unpack(int rootfd, int flags, pkg_reader_t *rd) if (list == NULL) return -1; - list = image_entry_sort(list); - if (pkg_reader_rewind(rd)) goto fail; diff --git a/main/pkgio_rd_image_entry.c b/main/pkgio_rd_image_entry.c index 76e063d..8e70617 100644 --- a/main/pkgio_rd_image_entry.c +++ b/main/pkgio_rd_image_entry.c @@ -170,7 +170,7 @@ image_entry_t *image_entry_list_from_package(pkg_reader_t *pkg) goto fail_multi; } - return list; + return image_entry_sort(list); fail_oom: fputs("out of memory\n", stderr); goto fail;