OSDN Git Service

libparted: make pc98 detection depend on signatures
authorBrian C. Lane <bcl@redhat.com>
Fri, 7 Oct 2011 23:53:49 +0000 (16:53 -0700)
committerJim Meyering <meyering@redhat.com>
Wed, 19 Oct 2011 12:18:19 +0000 (14:18 +0200)
pc98 is not a common disk label. Change pc98_probe to only return true
if one of the recognized signatures is present.
Currently these include:

IPL1
Linux 98
GRUB/98

This prevents false-positive detection on msdos labeled disks.

* libparted/labels/pc98.c (pc98_probe): Change to require signature
(pc98_check_ipl_signature): Add more signatures
(check_partition_consistency): Remove unused function
Reported by Zach Carter in http://bugzilla.redhat.com/646053

NEWS
libparted/labels/pc98.c

diff --git a/NEWS b/NEWS
index 293dad8..b7fb56b 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -17,6 +17,10 @@ GNU parted NEWS                                    -*- outline -*-
   libparted: works with a two-component linux kernel version number like 3.0
   [bug present since the beginning]
 
+  libparted: strengthen the pc98 test so that it is much less likely to
+  cause an MSDOS partition table to be mistakenly identified as pc98.
+  [bug present since the beginning]
+
 
 * Noteworthy changes in release 3.0 (2011-05-30) [stable]
 
index 3afa8a2..d60843d 100644 (file)
@@ -140,45 +140,20 @@ pc98_check_magic (const PC98RawTable *part_table)
 static int
 pc98_check_ipl_signature (const PC98RawTable *part_table)
 {
-       return !memcmp (part_table->boot_code + 4, "IPL1", 4);
-}
-
-static int
-check_partition_consistency (const PedDevice* dev,
-                            const PC98RawPartition* raw_part)
-{
-       if (raw_part->ipl_sect >= dev->hw_geom.sectors
-          || raw_part->sector >= dev->hw_geom.sectors
-          || raw_part->end_sector >= dev->hw_geom.sectors
-          || raw_part->ipl_head >= dev->hw_geom.heads
-          || raw_part->head >= dev->hw_geom.heads
-          || raw_part->end_head >= dev->hw_geom.heads
-          || PED_LE16_TO_CPU(raw_part->ipl_cyl) >= dev->hw_geom.cylinders
-          || PED_LE16_TO_CPU(raw_part->cyl) >= dev->hw_geom.cylinders
-          || PED_LE16_TO_CPU(raw_part->end_cyl) >= dev->hw_geom.cylinders
-          || PED_LE16_TO_CPU(raw_part->cyl)
-               > PED_LE16_TO_CPU(raw_part->end_cyl)
-#if 0
-          || !chs_to_sector(dev, PED_LE16_TO_CPU(raw_part->ipl_cyl),
-                            raw_part->ipl_head, raw_part->ipl_sect)
-          || !chs_to_sector(dev, PED_LE16_TO_CPU(raw_part->cyl),
-                            raw_part->head, raw_part->sector)
-          || !chs_to_sector(dev, PED_LE16_TO_CPU(raw_part->end_cyl),
-                            raw_part->end_head, raw_part->end_sector)
-#endif
-          || PED_LE16_TO_CPU(raw_part->end_cyl)
-                       < PED_LE16_TO_CPU(raw_part->cyl))
+       if (memcmp (part_table->boot_code + 4, "IPL1", 4) == 0)
+               return 1;
+       else if (memcmp (part_table->boot_code + 4, "Linux 98", 8) == 0)
+               return 1;
+       else if (memcmp (part_table->boot_code + 4, "GRUB/98 ", 8) == 0)
+               return 1;
+       else
                return 0;
-
-       return 1;
 }
 
 static int
 pc98_probe (const PedDevice *dev)
 {
        PC98RawTable            part_table;
-       int                     empty;
-       const PC98RawPartition* p;
 
        PED_ASSERT (dev != NULL);
 
@@ -192,30 +167,8 @@ pc98_probe (const PedDevice *dev)
        if (!pc98_check_magic (&part_table))
                return 0;
 
-       /* check consistency */
-       empty = 1;
-       for (p = part_table.partitions;
-            p < part_table.partitions + MAX_PART_COUNT;
-            p++)
-       {
-               if (p->mid == 0 && p->sid == 0)
-                       continue;
-               empty = 0;
-               if (!check_partition_consistency (dev, p))
-                       return 0;
-       }
-
-       /* check boot loader */
-       if (pc98_check_ipl_signature (&part_table))
-               return 1;
-       else if (part_table.boot_code[0])       /* invalid boot loader */
-               return 0;
-
-       /* Not to mistake msdos disk map for PC-9800's empty disk map  */
-       if (empty)
-               return 0;
-
-       return 1;
+       /* check for boot loader signatures */
+       return pc98_check_ipl_signature (&part_table);
 }
 
 static PedDisk*