From: Vladimir 'phcoder' Serbinenko Date: Tue, 13 Dec 2011 00:57:07 +0000 (+0100) Subject: * grub-core/fs/romfs.c (grub_romfs_iterate_dir): Properly align X-Git-Tag: 2.00~911 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=20993fbb9f820ecd0d9245c64574b5333d330779;p=thirdparty%2Fgrub.git * grub-core/fs/romfs.c (grub_romfs_iterate_dir): Properly align name for checksum and fix allocation algorithm. --- diff --git a/ChangeLog b/ChangeLog index c64fe07b7..086b61ff9 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,8 @@ +2011-12-13 Vladimir Serbinenko + + * grub-core/fs/romfs.c (grub_romfs_iterate_dir): Properly align + name for checksum and fix allocation algorithm. + 2011-12-13 Vladimir Serbinenko * include/grub/types.h (grub_properly_aligned_t): New type. diff --git a/grub-core/fs/romfs.c b/grub-core/fs/romfs.c index 202ca102e..76e13727d 100644 --- a/grub-core/fs/romfs.c +++ b/grub-core/fs/romfs.c @@ -166,17 +166,18 @@ grub_romfs_iterate_dir (grub_fshelp_node_t dir, { grub_disk_addr_t caddr; struct grub_romfs_file_header hdr; - grub_size_t a = 0; - char *name = NULL; unsigned nptr; unsigned i, j; + grub_size_t a = 0; + grub_properly_aligned_t *name = NULL; + for (caddr = dir->data_addr; caddr; caddr = grub_be_to_cpu32 (hdr.next_file) & ~(GRUB_ROMFS_ALIGN - 1)) { grub_disk_addr_t naddr = caddr + sizeof (hdr); grub_uint32_t csum = 0; enum grub_fshelp_filetype filetype = GRUB_FSHELP_UNKNOWN; - struct grub_fshelp_node *node; + struct grub_fshelp_node *node = NULL; grub_err_t err; err = grub_disk_read (dir->data->disk, caddr >> GRUB_DISK_SECTOR_BITS, @@ -189,9 +190,9 @@ grub_romfs_iterate_dir (grub_fshelp_node_t dir, } for (nptr = 0; ; nptr++, naddr += 16) { - if (a >= nptr) + if (a <= nptr) { - char *on; + grub_properly_aligned_t *on; a = 2 * (nptr + 1); on = name; name = grub_realloc (name, a * 16); @@ -201,13 +202,14 @@ grub_romfs_iterate_dir (grub_fshelp_node_t dir, return 1; } } + COMPILE_TIME_ASSERT (16 % sizeof (name[0]) == 0); err = grub_disk_read (dir->data->disk, naddr >> GRUB_DISK_SECTOR_BITS, naddr & (GRUB_DISK_SECTOR_SIZE - 1), - 16, name + 16 * nptr); + 16, name + (16 / sizeof (name[0])) * nptr); if (err) return 1; for (j = 0; j < 16; j++) - if (!name[16 * nptr + j]) + if (!((char *) name)[16 * nptr + j]) break; if (j != 16) break; @@ -292,7 +294,7 @@ grub_romfs_iterate_dir (grub_fshelp_node_t dir, } } - if (hook (name, filetype, node)) + if (hook ((char *) name, filetype, node)) { grub_free (name); return 1;