aboutsummaryrefslogtreecommitdiff
path: root/squashfs-tools
diff options
context:
space:
mode:
authorPhillip Lougher <phillip@squashfs.org.uk>2013-01-20 04:48:38 +0000
committerPhillip Lougher <phillip@squashfs.org.uk>2013-01-22 04:48:00 +0000
commit2c41b02483d909ac0ac78649dd31b2f0a19e8a67 (patch)
tree4f61dd662184325febeedfb60de1dd6b26716733 /squashfs-tools
parent88beecab29b01b7335939fd88cc1fdeec8dece9f (diff)
downloadsquashfs-tools-2c41b02483d909ac0ac78649dd31b2f0a19e8a67.tar.gz
read_fs: When reading fragment_table pass expected number of bytes to read_block()
Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
Diffstat (limited to 'squashfs-tools')
-rw-r--r--squashfs-tools/read_fs.c14
1 files changed, 9 insertions, 5 deletions
diff --git a/squashfs-tools/read_fs.c b/squashfs-tools/read_fs.c
index 482343e..71d5fe4 100644
--- a/squashfs-tools/read_fs.c
+++ b/squashfs-tools/read_fs.c
@@ -614,17 +614,19 @@ unsigned int *read_id_table(int fd, struct squashfs_super_block *sBlk)
int read_fragment_table(int fd, struct squashfs_super_block *sBlk,
struct squashfs_fragment_entry **fragment_table)
{
- int res, i, indexes = SQUASHFS_FRAGMENT_INDEXES(sBlk->fragments);
+ int res, i;
+ int bytes = SQUASHFS_FRAGMENT_BYTES(sBlk->fragments);
+ int indexes = SQUASHFS_FRAGMENT_INDEXES(sBlk->fragments);
long long fragment_table_index[indexes];
TRACE("read_fragment_table: %d fragments, reading %d fragment indexes "
"from 0x%llx\n", sBlk->fragments, indexes,
sBlk->fragment_table_start);
+
if(sBlk->fragments == 0)
return 1;
- *fragment_table = malloc(sBlk->fragments *
- sizeof(struct squashfs_fragment_entry));
+ *fragment_table = malloc(bytes);
if(*fragment_table == NULL) {
ERROR("Failed to allocate fragment table\n");
return 0;
@@ -641,8 +643,10 @@ int read_fragment_table(int fd, struct squashfs_super_block *sBlk,
SQUASHFS_INSWAP_FRAGMENT_INDEXES(fragment_table_index, indexes);
for(i = 0; i < indexes; i++) {
- int length = read_block(fd, fragment_table_index[i], NULL, 0,
- ((unsigned char *) *fragment_table) +
+ int expected = (i + 1) != indexes ? SQUASHFS_METADATA_SIZE :
+ bytes & (SQUASHFS_METADATA_SIZE - 1);
+ int length = read_block(fd, fragment_table_index[i], NULL,
+ expected, ((unsigned char *) *fragment_table) +
(i * SQUASHFS_METADATA_SIZE));
TRACE("Read fragment table block %d, from 0x%llx, length %d\n",
i, fragment_table_index[i], length);