2008-07-28 Robert Millan <rmh@aybabtu.com>

* partmap/apple.c (GRUB_APPLE_HEADER_MAGIC): New macro.
        (struct grub_apple_header): New struct.  Describes the layout of
        the partmap header.
        (apple_partition_map_iterate): Check the header magic as well as the
        partition magic (which was already being checked).
This commit is contained in:
robertmh 2008-07-28 22:37:32 +00:00
parent cfd0b4e6fa
commit 41694fd019
2 changed files with 36 additions and 6 deletions

View file

@ -1,3 +1,11 @@
2008-07-28 Robert Millan <rmh@aybabtu.com>
* partmap/apple.c (GRUB_APPLE_HEADER_MAGIC): New macro.
(struct grub_apple_header): New struct. Describes the layout of
the partmap header.
(apple_partition_map_iterate): Check the header magic as well as the
partition magic (which was already being checked).
2008-07-28 Pavel Roskin <proski@gnu.org>
* genmk.rb: Add a warning to the beginning of the output that

View file

@ -1,7 +1,7 @@
/* apple.c - Read macintosh partition tables. */
/*
* GRUB -- GRand Unified Bootloader
* Copyright (C) 2002,2004,2005,2006,2007 Free Software Foundation, Inc.
* Copyright (C) 2002,2004,2005,2006,2007,2008 Free Software Foundation, Inc.
*
* GRUB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@ -22,11 +22,19 @@
#include <grub/mm.h>
#include <grub/partition.h>
#define GRUB_APPLE_HEADER_MAGIC 0x4552
#define GRUB_APPLE_PART_MAGIC 0x504D
struct grub_apple_header
{
/* The magic number to identify the partition map, it should have
the value `0x4552'. */
grub_uint16_t magic;
};
struct grub_apple_part
{
/* The magic number to idenify this as a partition, it should have
/* The magic number to identify this as a partition, it should have
the value `0x504D'. */
grub_uint16_t magic;
@ -98,6 +106,7 @@ apple_partition_map_iterate (grub_disk_t disk,
const grub_partition_t partition))
{
struct grub_partition part;
struct grub_apple_header aheader;
struct grub_apple_part apart;
struct grub_disk raw;
int partno = 0;
@ -109,6 +118,18 @@ apple_partition_map_iterate (grub_disk_t disk,
part.partmap = &grub_apple_partition_map;
if (grub_disk_read (&raw, 0, 0, sizeof (aheader), (char *) &aheader))
return grub_errno;
if (grub_be_to_cpu16 (aheader.magic) != GRUB_APPLE_HEADER_MAGIC)
{
grub_dprintf ("partition",
"bad magic (found 0x%x; wanted 0x%x\n",
grub_be_to_cpu16 (aheader.magic),
GRUB_APPLE_HEADER_MAGIC);
goto fail;
}
for (;;)
{
if (grub_disk_read (&raw, pos / GRUB_DISK_SECTOR_SIZE,
@ -147,11 +168,12 @@ apple_partition_map_iterate (grub_disk_t disk,
partno++;
}
if (pos == GRUB_DISK_SECTOR_SIZE)
return grub_error (GRUB_ERR_BAD_PART_TABLE,
"Apple partition map not found.");
if (pos != GRUB_DISK_SECTOR_SIZE)
return 0;
return 0;
fail:
return grub_error (GRUB_ERR_BAD_PART_TABLE,
"Apple partition map not found.");
}