diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-07-07 00:35:58 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2019-07-07 00:35:58 +0200 |
commit | b2598623d8a4e3d3e83ee28da3ecdb0d4479a8f8 (patch) | |
tree | 3b9f408577653f48f823848ce6655558085304f0 /lib/sqfs | |
parent | 9236c4599ba41291382bb71d16bcf84d68583fba (diff) |
read_inode: determine mode bits from inode type
Instead of insisting that mode bits and inode type match up, determine
ignore the mode bits and determine them from the inode type.
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfs')
-rw-r--r-- | lib/sqfs/read_inode.c | 67 |
1 files changed, 26 insertions, 41 deletions
diff --git a/lib/sqfs/read_inode.c b/lib/sqfs/read_inode.c index c6c932c..565cb5a 100644 --- a/lib/sqfs/read_inode.c +++ b/lib/sqfs/read_inode.c @@ -9,50 +9,38 @@ #define SWAB32(x) x = le32toh(x) #define SWAB64(x) x = le64toh(x) -static int check_mode(sqfs_inode_t *inode) +static int set_mode(sqfs_inode_t *inode) { - switch (inode->mode & S_IFMT) { - case S_IFSOCK: - if (inode->type != SQFS_INODE_SOCKET && - inode->type != SQFS_INODE_EXT_SOCKET) { - goto fail_mismatch; - } + inode->mode &= ~S_IFMT; + + switch (inode->type) { + case SQFS_INODE_SOCKET: + case SQFS_INODE_EXT_SOCKET: + inode->mode |= S_IFSOCK; break; - case S_IFLNK: - if (inode->type != SQFS_INODE_SLINK && - inode->type != SQFS_INODE_EXT_SLINK) { - goto fail_mismatch; - } + case SQFS_INODE_SLINK: + case SQFS_INODE_EXT_SLINK: + inode->mode |= S_IFLNK; break; - case S_IFREG: - if (inode->type != SQFS_INODE_FILE && - inode->type != SQFS_INODE_EXT_FILE) { - goto fail_mismatch; - } + case SQFS_INODE_FILE: + case SQFS_INODE_EXT_FILE: + inode->mode |= S_IFREG; break; - case S_IFBLK: - if (inode->type != SQFS_INODE_BDEV && - inode->type != SQFS_INODE_EXT_BDEV) { - goto fail_mismatch; - } + case SQFS_INODE_BDEV: + case SQFS_INODE_EXT_BDEV: + inode->mode |= S_IFBLK; break; - case S_IFDIR: - if (inode->type != SQFS_INODE_DIR && - inode->type != SQFS_INODE_EXT_DIR) { - goto fail_mismatch; - } + case SQFS_INODE_DIR: + case SQFS_INODE_EXT_DIR: + inode->mode |= S_IFDIR; break; - case S_IFCHR: - if (inode->type != SQFS_INODE_CDEV && - inode->type != SQFS_INODE_EXT_CDEV) { - goto fail_mismatch; - } + case SQFS_INODE_CDEV: + case SQFS_INODE_EXT_CDEV: + inode->mode |= S_IFCHR; break; - case S_IFIFO: - if (inode->type != SQFS_INODE_FIFO && - inode->type != SQFS_INODE_EXT_FIFO) { - goto fail_mismatch; - } + case SQFS_INODE_FIFO: + case SQFS_INODE_EXT_FIFO: + inode->mode |= S_IFIFO; break; default: fputs("Found inode with unknown file mode\n", stderr); @@ -60,9 +48,6 @@ static int check_mode(sqfs_inode_t *inode) } return 0; -fail_mismatch: - fputs("Found inode where type does not match mode\n", stderr); - return -1; } static sqfs_inode_generic_t *read_inode_file(meta_reader_t *ir, @@ -218,7 +203,7 @@ sqfs_inode_generic_t *meta_reader_read_inode(meta_reader_t *ir, SWAB32(inode.mod_time); SWAB32(inode.inode_number); - if (check_mode(&inode)) + if (set_mode(&inode)) return NULL; /* inode types where the size is variable */ |