diff options
| author | Norbert van Bolhuis <nvbolhuis@gmail.com> | 2024-12-24 01:49:04 +0100 | 
|---|---|---|
| committer | Tom Rini <trini@konsulko.com> | 2025-01-18 08:29:10 -0600 | 
| commit | bbfa4fe13ca7645bd3033513dda48920e7c25542 (patch) | |
| tree | 5397c3d096925ddc8eda4ac1d47e9fefb6f8232a /fs/squashfs/sqfs_inode.c | |
| parent | a0defa4f358145d34e69bcd059b407ea853580cb (diff) | |
squashfs: Fix sqfs_inode_size() for xattr related SQFS_LSYMLINK_TYPE
A squashfs filesystem with extended attributes (xattrs) may have
inodes of type SQFS_LSYMLINK_TYPE. This might cause u-boot to fail to
handle the filesystem since it assumes a SYMLINK_TYPE and LSYMLINK_TYPE
inode are the same size. This is wrong, see:
https://github.com/plougher/squashfs-tools/blob/master/squashfs-tools/read_fs.c#L421
Using the mksquashfs '-no-xattrs' argument is probably best, but the
mksquashfs '-xattrs' argument is the default.
This patch fixes squashfs image handling by making sure parsing the
uncompressed inode_table (with sqfs_find_inode) succeeeds. The only change
needed is correctly determining the size of a SQFS_LSYMLINK_TYPE inode.
Signed-off-by: Norbert van Bolhuis <nvbolhuis@gmail.com>
Diffstat (limited to 'fs/squashfs/sqfs_inode.c')
| -rw-r--r-- | fs/squashfs/sqfs_inode.c | 6 | 
1 files changed, 4 insertions, 2 deletions
| diff --git a/fs/squashfs/sqfs_inode.c b/fs/squashfs/sqfs_inode.c index bb3ccd37e33..ce9a8ff8e2a 100644 --- a/fs/squashfs/sqfs_inode.c +++ b/fs/squashfs/sqfs_inode.c @@ -19,7 +19,9 @@  int sqfs_inode_size(struct squashfs_base_inode *inode, u32 blk_size)  { -	switch (get_unaligned_le16(&inode->inode_type)) { +	u16 inode_type = get_unaligned_le16(&inode->inode_type); + +	switch (inode_type) {  	case SQFS_DIR_TYPE:  		return sizeof(struct squashfs_dir_inode); @@ -87,7 +89,7 @@ int sqfs_inode_size(struct squashfs_base_inode *inode, u32 blk_size)  		    get_unaligned_le32(&symlink->symlink_size), &size))  			return -EINVAL; -		return size; +		return (inode_type == SQFS_SYMLINK_TYPE) ? size : size + sizeof(u32);  	}  	case SQFS_BLKDEV_TYPE: | 
