diff options
author | Phillip Lougher <phillip@squashfs.org.uk> | 2013-01-20 04:48:38 +0000 |
---|---|---|
committer | Phillip Lougher <phillip@squashfs.org.uk> | 2013-01-22 04:48:00 +0000 |
commit | 2c41b02483d909ac0ac78649dd31b2f0a19e8a67 (patch) | |
tree | 4f61dd662184325febeedfb60de1dd6b26716733 /squashfs-tools | |
parent | 88beecab29b01b7335939fd88cc1fdeec8dece9f (diff) | |
download | squashfs-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.c | 14 |
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); |