Matthew. I modified it a little... Hope you don't mind.
Regards. On Tue, Dec 02, 2008 at 08:16:49PM -0800, Matthew S. Harris wrote: > Here's my one remaining fix. Yes, I've been sitting on this one since > April 2007 too. Hopefully it's clear why this one is important. > > > Matthew > From 282be216499436242cdb3083c0e5d9b672db8682 Mon Sep 17 00:00:00 2001 > From: Matthew S. Harris <[email protected]> > Date: Tue, 2 Dec 2008 19:53:08 -0800 > Subject: [PATCH] Fix gpt_read to read all of the partition entries correctly. > > * libparted/labels/gpt.c (gpt_read): Use the SizeOfPartitionEntry > field value when reading the partition entries rather than assuming > that the entries are the same size as our struct. > > * libparted/labels/gpt.c (gpt_read): When reading the partition . . . > entries, round up, not down, the number of sectors to read. > if (!part) > goto error_delete_all; > > -- > 1.5.6.3 > > _______________________________________________ > parted-devel mailing list > [email protected] > http://lists.alioth.debian.org/mailman/listinfo/parted-devel -- Joel Andres Granados Brno, Czech Republic, Red Hat.
>From 457bc6cbba7ec31d49cf7bf486f15b9dd49f1ae1 Mon Sep 17 00:00:00 2001 From: Matthew S. Harris <[email protected]> Date: Tue, 2 Dec 2008 19:53:08 -0800 Subject: [PATCH] Fix gpt_read to read all of the partition entries correctly. * libparted/labels/gpt.c (gpt_read): Use the SizeOfPartitionEntry field value when reading the partition entries rather than assuming that the entries are the same size as our struct. * libparted/labels/gpt.c (gpt_read): When reading the partition entries, round up, not down, the number of sectors to read. * libparted/labels/gpt.c (_header_is_valid): Check that the SizeOfPartitionEntry is sane. --- libparted/labels/gpt.c | 29 ++++++++++++++++++++++------- 1 files changed, 22 insertions(+), 7 deletions(-) diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c index 89e46fc..4597346 100644 --- a/libparted/labels/gpt.c +++ b/libparted/labels/gpt.c @@ -38,6 +38,7 @@ #include <unistd.h> #include <uuid/uuid.h> #include <stdbool.h> +#include "xalloc.h" #if ENABLE_NLS # include <libintl.h> @@ -603,6 +604,14 @@ _header_is_valid (const PedDevice* dev, GuidPartitionTableHeader_t* gpt) || PED_LE32_TO_CPU (gpt->HeaderSize) > dev->sector_size) return 0; + /* + * the SizeOfPartitionEntry must be a multiple of 8 and + * greater than the size of the PartitionEntry structure. + */ + uint32_t sope = gpt->SizeOfPartitionEntry; + if (sope % 8 != 0 || sope < sizeof(GuidPartitionEntry_t) ) + return 0; + origcrc = gpt->HeaderCRC32; gpt->HeaderCRC32 = 0; crc = pth_crc32 (dev, gpt); @@ -807,8 +816,8 @@ gpt_read (PedDisk * disk) { GPTDiskData *gpt_disk_data = disk->disk_specific; GuidPartitionTableHeader_t* gpt; - GuidPartitionEntry_t* ptes; - int ptes_size; + void* ptes; + int ptes_sectors; int i; #ifndef DISCOVER_ONLY int write_back = 0; @@ -902,22 +911,28 @@ gpt_read (PedDisk * disk) if (!_parse_header (disk, gpt, &write_back)) goto error_free_gpt; + ptes_sectors = ped_div_round_up(gpt->SizeOfPartitionEntry * + gpt_disk_data->entry_count, disk->dev->sector_size); + + if (xalloc_oversized (ptes_sectors, disk->dev->sector_size)) + goto error_free_gpt; + ptes = ped_malloc (ptes_sectors * disk->dev->sector_size); - ptes_size = sizeof (GuidPartitionEntry_t) * gpt_disk_data->entry_count; - ptes = (GuidPartitionEntry_t*) ped_malloc (ptes_size); if (!ped_device_read (disk->dev, ptes, PED_LE64_TO_CPU(gpt->PartitionEntryLBA), - ptes_size / disk->dev->sector_size)) + ptes_sectors)) goto error_free_ptes; for (i = 0; i < gpt_disk_data->entry_count; i++) { + GuidPartitionEntry_t* pte = (GuidPartitionEntry_t*) (ptes + + i * gpt->SizeOfPartitionEntry); PedPartition* part; PedConstraint* constraint_exact; - if (!guid_cmp (ptes[i].PartitionTypeGuid, UNUSED_ENTRY_GUID)) + if (!guid_cmp (pte->PartitionTypeGuid, UNUSED_ENTRY_GUID)) continue; - part = _parse_part_entry (disk, &ptes[i]); + part = _parse_part_entry (disk, pte); if (!part) goto error_delete_all; -- 1.6.0.6
_______________________________________________ parted-devel mailing list [email protected] http://lists.alioth.debian.org/mailman/listinfo/parted-devel

