[PATCH] squashfs: Fix sqfsls errors when root is a ldir

Campbell Suter campbell at snapit.group
Wed Dec 15 02:53:43 CET 2021


Previously, if root had more than 256 files or otherwise needed to be an
ldir, sqfsls would emit the error 'Inode not found.' which was caused by
code in sqfs_search_dir assuming it was a regular directory inode.

Signed-off-by: Campbell Suter <campbell at snapit.group>
---

  fs/squashfs/sqfs.c | 16 +++++++++++++---
  1 file changed, 13 insertions(+), 3 deletions(-)

diff --git a/fs/squashfs/sqfs.c b/fs/squashfs/sqfs.c
index e2d91c654c..4d7bf76fa3 100644
--- a/fs/squashfs/sqfs.c
+++ b/fs/squashfs/sqfs.c
@@ -482,13 +482,20 @@ static int sqfs_search_dir(struct squashfs_dir_stream *dirs, char **token_list,
  
  	/* Initialize squashfs_dir_stream members */
  	dirs->table += SQFS_DIR_HEADER_SIZE;
-	dirs->size = get_unaligned_le16(&dir->file_size) - SQFS_DIR_HEADER_SIZE;
+	if (le16_to_cpu(dirs->i_dir.inode_type) == SQFS_DIR_TYPE)
+		dirs->size = get_unaligned_le16(&dir->file_size);
+	else
+		dirs->size = get_unaligned_le32(&ldir->file_size);
+	dirs->size -= SQFS_DIR_HEADER_SIZE;
  	dirs->entry_count = dirs->dir_header->count + 1;
  
  	/* No path given -> root directory */
  	if (!strcmp(token_list[0], "/")) {
  		dirs->table = &dirs->dir_table[offset];
-		memcpy(&dirs->i_dir, dir, sizeof(*dir));
+		if (le16_to_cpu(dirs->i_dir.inode_type) == SQFS_DIR_TYPE)
+			memcpy(&dirs->i_dir, dir, sizeof(*dir));
+		else
+			memcpy(&dirs->i_ldir, ldir, sizeof(*ldir));
  		return 0;
  	}
  
@@ -608,7 +615,10 @@ static int sqfs_search_dir(struct squashfs_dir_stream *dirs, char **token_list,
  		}
  
  		dirs->table += SQFS_DIR_HEADER_SIZE;
-		dirs->size = get_unaligned_le16(&dir->file_size);
+		if (le16_to_cpu(dirs->i_dir.inode_type) == SQFS_DIR_TYPE)
+			dirs->size = get_unaligned_le16(&dir->file_size);
+		else
+			dirs->size = get_unaligned_le32(&ldir->file_size);
  		dirs->entry_count = dirs->dir_header->count + 1;
  		dirs->size -= SQFS_DIR_HEADER_SIZE;
  		free(dirs->entry);
-- 
2.33.1



More information about the U-Boot mailing list