* grub-core/fs/squash4.c (grub_squash_inode): Fix field sizes.
(grub_squash_dirent_header): Likewise. (read_chunk): Don't double swap. (grub_squash_iterate_dir): Fix swap sizes.
This commit is contained in:
parent
3c349f5a37
commit
efc2616ee1
2 changed files with 21 additions and 11 deletions
|
@ -1,3 +1,10 @@
|
||||||
|
2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
|
* grub-core/fs/squash4.c (grub_squash_inode): Fix field sizes.
|
||||||
|
(grub_squash_dirent_header): Likewise.
|
||||||
|
(read_chunk): Don't double swap.
|
||||||
|
(grub_squash_iterate_dir): Fix swap sizes.
|
||||||
|
|
||||||
2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
2011-12-13 Vladimir Serbinenko <phcoder@gmail.com>
|
||||||
|
|
||||||
* grub-core/fs/jfs.c (grub_jfs_getent): Handle UTF16 endianness.
|
* grub-core/fs/jfs.c (grub_jfs_getent): Handle UTF16 endianness.
|
||||||
|
|
|
@ -80,7 +80,8 @@ struct grub_squash_inode
|
||||||
grub_uint32_t dummy;
|
grub_uint32_t dummy;
|
||||||
grub_uint32_t chunk;
|
grub_uint32_t chunk;
|
||||||
grub_uint32_t fragment;
|
grub_uint32_t fragment;
|
||||||
grub_uint32_t offset;
|
grub_uint16_t offset;
|
||||||
|
grub_uint16_t dummy2;
|
||||||
grub_uint32_t size;
|
grub_uint32_t size;
|
||||||
grub_uint32_t block_size[0];
|
grub_uint32_t block_size[0];
|
||||||
} __attribute__ ((packed)) file;
|
} __attribute__ ((packed)) file;
|
||||||
|
@ -90,8 +91,9 @@ struct grub_squash_inode
|
||||||
grub_uint64_t size;
|
grub_uint64_t size;
|
||||||
grub_uint32_t dummy2[3];
|
grub_uint32_t dummy2[3];
|
||||||
grub_uint32_t fragment;
|
grub_uint32_t fragment;
|
||||||
grub_uint32_t offset;
|
grub_uint16_t offset;
|
||||||
grub_uint32_t dummy3;
|
grub_uint16_t dummy3;
|
||||||
|
grub_uint32_t dummy4;
|
||||||
grub_uint32_t block_size[0];
|
grub_uint32_t block_size[0];
|
||||||
} __attribute__ ((packed)) long_file;
|
} __attribute__ ((packed)) long_file;
|
||||||
struct {
|
struct {
|
||||||
|
@ -99,8 +101,9 @@ struct grub_squash_inode
|
||||||
grub_uint32_t chunk;
|
grub_uint32_t chunk;
|
||||||
grub_uint32_t dummy2;
|
grub_uint32_t dummy2;
|
||||||
grub_uint16_t size;
|
grub_uint16_t size;
|
||||||
grub_uint32_t offset;
|
grub_uint16_t offset;
|
||||||
grub_uint16_t dummy3;
|
grub_uint16_t dummy3;
|
||||||
|
grub_uint16_t dummy4;
|
||||||
} __attribute__ ((packed)) dir;
|
} __attribute__ ((packed)) dir;
|
||||||
struct {
|
struct {
|
||||||
grub_uint64_t dummy;
|
grub_uint64_t dummy;
|
||||||
|
@ -124,7 +127,8 @@ struct grub_squash_dirent_header
|
||||||
{
|
{
|
||||||
/* Actually the value is the number of elements - 1. */
|
/* Actually the value is the number of elements - 1. */
|
||||||
grub_uint32_t nelems;
|
grub_uint32_t nelems;
|
||||||
grub_uint64_t ino_chunk;
|
grub_uint32_t ino_chunk;
|
||||||
|
grub_uint32_t dummy;
|
||||||
} __attribute__ ((packed));
|
} __attribute__ ((packed));
|
||||||
|
|
||||||
struct grub_squash_dirent
|
struct grub_squash_dirent
|
||||||
|
@ -186,10 +190,8 @@ struct grub_fshelp_node
|
||||||
|
|
||||||
static grub_err_t
|
static grub_err_t
|
||||||
read_chunk (struct grub_squash_data *data, void *buf, grub_size_t len,
|
read_chunk (struct grub_squash_data *data, void *buf, grub_size_t len,
|
||||||
grub_uint64_t chunk, grub_off_t offset)
|
grub_uint64_t chunk_start, grub_off_t offset)
|
||||||
{
|
{
|
||||||
grub_uint64_t chunk_start;
|
|
||||||
chunk_start = grub_le_to_cpu64 (chunk);
|
|
||||||
while (len > 0)
|
while (len > 0)
|
||||||
{
|
{
|
||||||
grub_uint64_t csize;
|
grub_uint64_t csize;
|
||||||
|
@ -335,7 +337,7 @@ grub_squash_iterate_dir (grub_fshelp_node_t dir,
|
||||||
unsigned i;
|
unsigned i;
|
||||||
|
|
||||||
/* FIXME: why - 3 ? */
|
/* FIXME: why - 3 ? */
|
||||||
endoff = grub_le_to_cpu32 (dir->ino.dir.size) + off - 3;
|
endoff = grub_le_to_cpu16 (dir->ino.dir.size) + off - 3;
|
||||||
|
|
||||||
while (off < endoff)
|
while (off < endoff)
|
||||||
{
|
{
|
||||||
|
@ -348,7 +350,7 @@ grub_squash_iterate_dir (grub_fshelp_node_t dir,
|
||||||
if (err)
|
if (err)
|
||||||
return 0;
|
return 0;
|
||||||
off += sizeof (dh);
|
off += sizeof (dh);
|
||||||
for (i = 0; i < (unsigned) grub_le_to_cpu16 (dh.nelems) + 1; i++)
|
for (i = 0; i < (unsigned) grub_le_to_cpu32 (dh.nelems) + 1; i++)
|
||||||
{
|
{
|
||||||
char *buf;
|
char *buf;
|
||||||
int r;
|
int r;
|
||||||
|
@ -594,7 +596,8 @@ direct_read (struct grub_squash_data *data,
|
||||||
read = grub_le_to_cpu32 (data->sb.block_size) - boff;
|
read = grub_le_to_cpu32 (data->sb.block_size) - boff;
|
||||||
if (read > len)
|
if (read > len)
|
||||||
read = len;
|
read = len;
|
||||||
if (!(ino->block_sizes[i] & SQUASH_BLOCK_UNCOMPRESSED))
|
if (!(ino->block_sizes[i]
|
||||||
|
& grub_cpu_to_le32_compile_time (SQUASH_BLOCK_UNCOMPRESSED)))
|
||||||
err = grub_zlib_disk_read (data->disk,
|
err = grub_zlib_disk_read (data->disk,
|
||||||
ino->cumulated_block_sizes[i] + a,
|
ino->cumulated_block_sizes[i] + a,
|
||||||
boff, buf, read);
|
boff, buf, read);
|
||||||
|
|
Loading…
Reference in a new issue