From: Norbert van Bolhuis Date: Tue, 24 Dec 2024 00:49:04 +0000 (+0100) Subject: squashfs: Fix sqfs_inode_size() for xattr related SQFS_LSYMLINK_TYPE X-Git-Tag: v2025.04-rc1~49 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=bbfa4fe13ca7645bd3033513dda48920e7c25542;p=pandora-u-boot.git 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 --- 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: