]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
* grub-core/partmap/sun.c (grub_sun_is_valid): make argument uint16_t *
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 13 Dec 2011 13:40:41 +0000 (14:40 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Tue, 13 Dec 2011 13:40:41 +0000 (14:40 +0100)
to ensure alignment.
(sun_partition_map_iterate): Make `block' a union to ensure alignment.

ChangeLog
grub-core/partmap/sun.c

index f974c76bcc505b6b481ea0f60f0dbbe4feab7ebc..d5d98c193bbfb896c11e5996aa324506e9df7b05 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2011-12-13  Vladimir Serbinenko  <phcoder@gmail.com>
+
+       * grub-core/partmap/sun.c (grub_sun_is_valid): make argument uint16_t *
+       to ensure alignment.
+       (sun_partition_map_iterate): Make `block' a union to ensure alignment.
+
 2011-12-13  Vladimir Serbinenko  <phcoder@gmail.com>
 
        * grub-core/fs/ntfs.c (u16at): Make into inline function.
index c7ef681c48014d0b07bdcd2bb45cc540e9b0bb5d..dfe51f35d18a3866c46a110f839f4abfe8d863a8 100644 (file)
@@ -71,13 +71,13 @@ static struct grub_partition_map grub_sun_partition_map;
 
 /* Verify checksum (true=ok).  */
 static int
-grub_sun_is_valid (struct grub_sun_block *label)
+grub_sun_is_valid (grub_uint16_t *label)
 {
   grub_uint16_t *pos;
   grub_uint16_t sum = 0;
 
-  for (pos = (grub_uint16_t *) label;
-       pos < (grub_uint16_t *) (label + 1);
+  for (pos = label;
+       pos < (label + sizeof (struct grub_sun_block) / 2);
        pos++)
     sum ^= *pos;
 
@@ -90,7 +90,11 @@ sun_partition_map_iterate (grub_disk_t disk,
                                        const grub_partition_t partition))
 {
   struct grub_partition p;
-  struct grub_sun_block block;
+  union
+  {
+    struct grub_sun_block sun;
+    grub_uint16_t raw[0];
+  } block;
   int partnum;
   grub_err_t err;
 
@@ -100,10 +104,10 @@ sun_partition_map_iterate (grub_disk_t disk,
   if (err)
     return err;
 
-  if (GRUB_PARTMAP_SUN_MAGIC != grub_be_to_cpu16 (block.magic))
+  if (GRUB_PARTMAP_SUN_MAGIC != grub_be_to_cpu16 (block.sun.magic))
     return grub_error (GRUB_ERR_BAD_PART_TABLE, "not a sun partition table");
 
-  if (! grub_sun_is_valid (&block))
+  if (! grub_sun_is_valid (block.raw))
       return grub_error (GRUB_ERR_BAD_PART_TABLE, "invalid checksum");
   
   /* Maybe another error value would be better, because partition
@@ -112,14 +116,14 @@ sun_partition_map_iterate (grub_disk_t disk,
     {
       struct grub_sun_partition_descriptor *desc;
 
-      if (block.infos[partnum].id == 0
-         || block.infos[partnum].id == GRUB_PARTMAP_SUN_WHOLE_DISK_ID)
+      if (block.sun.infos[partnum].id == 0
+         || block.sun.infos[partnum].id == GRUB_PARTMAP_SUN_WHOLE_DISK_ID)
        continue;
 
-      desc = &block.partitions[partnum];
+      desc = &block.sun.partitions[partnum];
       p.start = ((grub_uint64_t) grub_be_to_cpu32 (desc->start_cylinder)
-                 * grub_be_to_cpu16 (block.ntrks)
-                 * grub_be_to_cpu16 (block.nsect));
+                 * grub_be_to_cpu16 (block.sun.ntrks)
+                 * grub_be_to_cpu16 (block.sun.nsect));
       p.len = grub_be_to_cpu32 (desc->num_sectors);
       p.number = p.index = partnum;
       if (p.len)