From 68ff2e0c7563054e95389c1da5164b3d9c75c52b Mon Sep 17 00:00:00 2001 From: "Brian C. Lane" Date: Fri, 7 Oct 2011 10:56:00 -0700 Subject: [PATCH 1/2] libparted: make pc98 detection depend on signatures (#646053) 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 will prevent false-positive detection on msdos labeled disks * libparted/labels/pc98.c (pc98_probe): Change to require signature (pc98_check_ipl_signature): Add more signatures --- libparted/labels/pc98.c | 32 ++++++++++---------------------- 1 files changed, 10 insertions(+), 22 deletions(-) diff --git a/libparted/labels/pc98.c b/libparted/labels/pc98.c index 3afa8a2..ea3cf4e 100644 --- a/libparted/labels/pc98.c +++ b/libparted/labels/pc98.c @@ -140,7 +140,14 @@ 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); + 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; } static int @@ -192,27 +199,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) + /* check for boot loader signatures */ + if (!pc98_check_ipl_signature (&part_table)) return 0; return 1; -- 1.7.6.4