=== modified file 'grub-core/partmap/sun.c' --- grub-core/partmap/sun.c 2010-09-14 19:07:39 +0000 +++ grub-core/partmap/sun.c 2010-12-17 05:04:53 +0000 @@ -67,19 +67,27 @@ static struct grub_partition_map grub_sun_partition_map; -/* Verify checksum (true=ok). */ -static int -grub_sun_is_valid (struct grub_sun_block *label) +/* test whether we're dealing with a valid Sun disklabel */ +static grub_err_t +grub_sun_test (struct grub_sun_block *label) { grub_uint16_t *pos; grub_uint16_t sum = 0; + if (GRUB_PARTMAP_SUN_MAGIC != grub_be_to_cpu16 (label->magic)) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "not a sun partition table"); + for (pos = (grub_uint16_t *) label; pos < (grub_uint16_t *) (label + 1); pos++) sum ^= *pos; - return ! sum; + /* Maybe another error value would be better, because partition + table _is_ recognized but invalid. */ + if (sum) + return grub_error (GRUB_ERR_BAD_PART_TABLE, "invalid checksum"); + + return GRUB_ERR_NONE; } static grub_err_t @@ -98,14 +106,9 @@ if (err) return err; - if (GRUB_PARTMAP_SUN_MAGIC != grub_be_to_cpu16 (block.magic)) - return grub_error (GRUB_ERR_BAD_PART_TABLE, "not a sun partition table"); + if (GRUB_ERR_NONE != (err = grub_sun_test(&block))) + return err; - if (! grub_sun_is_valid (&block)) - return grub_error (GRUB_ERR_BAD_PART_TABLE, "invalid checksum"); - - /* Maybe another error value would be better, because partition - table _is_ recognized but invalid. */ for (partnum = 0; partnum < GRUB_PARTMAP_SUN_MAX_PARTS; partnum++) { struct grub_sun_partition_descriptor *desc;