From 55e47e40624f1c91f4e6af8d6ba17552dec152a2 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Thu, 4 Jul 2019 19:47:46 +0200 Subject: Fix: simplify deduction logic for squashfs inode type Signed-off-by: David Oberhollenzer --- include/squashfs.h | 2 -- lib/sqfs/write_inode.c | 45 ++++++++++++++++++++++++++------------------- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/include/squashfs.h b/include/squashfs.h index 6e2214b..01047cf 100644 --- a/include/squashfs.h +++ b/include/squashfs.h @@ -14,8 +14,6 @@ #define SQFS_DEVBLK_SIZE 4096 #define SQFS_MAX_DIR_ENT 256 -#define SQFS_INODE_EXT_TYPE(type) ((type) - 1 + 8) - typedef struct { uint32_t magic; uint32_t inode_count; diff --git a/lib/sqfs/write_inode.c b/lib/sqfs/write_inode.c index cd4c53a..d85d14d 100644 --- a/lib/sqfs/write_inode.c +++ b/lib/sqfs/write_inode.c @@ -9,24 +9,29 @@ static int get_type(tree_node_t *node) { - int type; - switch (node->mode & S_IFMT) { - case S_IFSOCK: type = SQFS_INODE_SOCKET; break; - case S_IFIFO: type = SQFS_INODE_FIFO; break; - case S_IFLNK: type = SQFS_INODE_SLINK; break; - case S_IFBLK: type = SQFS_INODE_BDEV; break; - case S_IFCHR: type = SQFS_INODE_CDEV; break; - case S_IFDIR: type = SQFS_INODE_DIR; break; - case S_IFREG: type = SQFS_INODE_FILE; break; - default: - assert(0); + case S_IFSOCK: + if (node->xattr != NULL) + return SQFS_INODE_EXT_SOCKET; + return SQFS_INODE_SOCKET; + case S_IFIFO: + if (node->xattr != NULL) + return SQFS_INODE_EXT_FIFO; + return SQFS_INODE_FIFO; + case S_IFLNK: + if (node->xattr != NULL) + return SQFS_INODE_EXT_SLINK; + return SQFS_INODE_SLINK; + case S_IFBLK: + if (node->xattr != NULL) + return SQFS_INODE_EXT_BDEV; + return SQFS_INODE_BDEV; + case S_IFCHR: + if (node->xattr != NULL) + return SQFS_INODE_EXT_CDEV; + return SQFS_INODE_CDEV; } - - if (node->xattr != NULL) - type = SQFS_INODE_EXT_TYPE(type); - - return type; + assert(0); } static size_t hard_link_count(tree_node_t *n) @@ -66,8 +71,6 @@ int meta_writer_write_inode(fstree_t *fs, id_table_t *idtbl, meta_writer_t *im, meta_writer_get_position(im, &block, &offset); node->inode_ref = (block << 16) | offset; - type = get_type(node); - if (S_ISDIR(node->mode)) { di = node->data.dir; @@ -84,11 +87,15 @@ int meta_writer_write_inode(fstree_t *fs, id_table_t *idtbl, meta_writer_t *im, } } else if (S_ISREG(node->mode)) { fi = node->data.file; + type = SQFS_INODE_FILE; if (fi->startblock > 0xFFFFFFFFUL || fi->size > 0xFFFFFFFFUL || - hard_link_count(node) > 1 || fi->sparse > 0) { + hard_link_count(node) > 1 || fi->sparse > 0 || + node->xattr != NULL) { type = SQFS_INODE_EXT_FILE; } + } else { + type = get_type(node); } base.type = htole16(type); -- cgit v1.2.3