]> git.ipfire.org Git - thirdparty/grub.git/commitdiff
Check amiga partmap checksum
authorVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 31 Dec 2010 14:23:06 +0000 (15:23 +0100)
committerVladimir 'phcoder' Serbinenko <phcoder@gmail.com>
Fri, 31 Dec 2010 14:23:06 +0000 (15:23 +0100)
grub-core/partmap/amiga.c

index 1e0f23402872a0b85d1268bf0e0ad51ed0eb165a..803e2e14f93dbed3cc9b144105cdaed559c57888 100644 (file)
@@ -37,7 +37,7 @@ struct grub_amiga_rdsk
   grub_uint32_t partitionlst;
   grub_uint32_t fslst;
 
-  /* The other information is not important for us.  */
+  grub_uint32_t unused[128 - 9];
 } __attribute__ ((packed));
 
 struct grub_amiga_partition
@@ -65,12 +65,24 @@ struct grub_amiga_partition
   grub_uint32_t highcyl;
 
   grub_uint32_t firstcyl;
+  grub_uint32_t unused[128 - 44];
 } __attribute__ ((packed));
 
 static struct grub_partition_map grub_amiga_partition_map;
 
 \f
 
+static grub_uint32_t
+amiga_partition_map_checksum (void *buf, grub_size_t sz)
+{
+  grub_uint32_t *ptr = buf;
+  grub_uint32_t r = 0;
+  sz /= sizeof (grub_uint32_t);
+  for (; sz; sz--, ptr++)
+    r += grub_be_to_cpu32 (*ptr);
+  return r;
+}
+
 static grub_err_t
 amiga_partition_map_iterate (grub_disk_t disk,
                             int (*hook) (grub_disk_t disk,
@@ -90,7 +102,8 @@ amiga_partition_map_iterate (grub_disk_t disk,
        return grub_errno;
 
       if (grub_memcmp (rdsk.magic, GRUB_AMIGA_RDSK_MAGIC,
-                      sizeof (rdsk.magic)) == 0)
+                      sizeof (rdsk.magic)) == 0
+         && amiga_partition_map_checksum (&rdsk, sizeof (rdsk)) == 0)
        {
          /* Found the first PART block.  */
          next = grub_be_to_cpu32 (rdsk.partitionlst);
@@ -112,7 +125,8 @@ amiga_partition_map_iterate (grub_disk_t disk,
        return grub_errno;
 
       if (grub_memcmp (apart.magic, GRUB_AMIGA_PART_MAGIC,
-                      sizeof (apart.magic)) == 0)
+                      sizeof (apart.magic)) == 0
+         && amiga_partition_map_checksum (&apart, sizeof (apart)) == 0)
 
       /* Calculate the first block and the size of the partition.  */
       part.start = (grub_be_to_cpu32 (apart.lowcyl)