aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2021-08-22 13:29:26 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2021-08-22 13:45:11 +0200
commit93f17ac5382be1102151fe1322ce90e85665e161 (patch)
treea311d9d1fd61d64b095420d91e7dfb1b0950f44b
parent11dfe80e867f199bbf40a3bdcffa77b4aa6429f6 (diff)
Fix half done initialization of sqfs_dir_reader_open_dir
The sqfs_dir_reader_open_dir function tried to take a short-cut by returning early if the target directory is empty. However, this left some field unchanged from the previous directory. If iterating over a directory and then deciding to enter a sub-directory that happens to be empty, the directory reader will keep the settings for the current directory. After calling sqfs_dir_reader_rewind, the sub-directory will suddenly report the contents of the parent. A similar check is added to the rewind function to not track back on the meta data reader in that case. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
-rw-r--r--lib/sqfs/dir_reader.c9
1 files changed, 6 insertions, 3 deletions
diff --git a/lib/sqfs/dir_reader.c b/lib/sqfs/dir_reader.c
index 65962d8..e6467ef 100644
--- a/lib/sqfs/dir_reader.c
+++ b/lib/sqfs/dir_reader.c
@@ -145,15 +145,15 @@ int sqfs_dir_reader_open_dir(sqfs_dir_reader_t *rd,
rd->size = size;
rd->entries = 0;
- if (rd->size <= sizeof(rd->hdr))
- return 0;
-
block_start += rd->super->directory_table_start;
rd->dir_block_start = block_start;
rd->dir_offset = offset;
rd->start_size = size;
+ if (rd->size <= sizeof(rd->hdr))
+ return 0;
+
return sqfs_meta_reader_seek(rd->meta_dir, block_start, offset);
}
@@ -200,6 +200,9 @@ int sqfs_dir_reader_rewind(sqfs_dir_reader_t *rd)
rd->size = rd->start_size;
rd->entries = 0;
+ if (rd->size <= sizeof(rd->hdr))
+ return 0;
+
return sqfs_meta_reader_seek(rd->meta_dir, rd->dir_block_start,
rd->dir_offset);
}