]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/fs/romfs.c (grub_romfs_iterate_dir): Properly align
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 13 Dec 2011 00:57:07 +0000 (01:57 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 13 Dec 2011 00:57:07 +0000 (01:57 +0100)
name for checksum and fix allocation algorithm.

ChangeLog
grub-core/fs/romfs.c

index c64fe07b7d50320b61da4434baf59efab7a9966f..086b61ff92f23a7ef7fee88961e0d10af17c5253 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2011-12-13  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/fs/romfs.c (grub_romfs_iterate_dir): Properly align
+       name for checksum and fix allocation algorithm.
+
 2011-12-13  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * include/grub/types.h (grub_properly_aligned_t): New type.
index 202ca102e032c98dc88ad08a0661e68ccc5c8c21..76e13727d47900e57aba008b3220220cf6eaf916 100644 (file)
@@ -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;