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.
---
libparted/labels/gpt.c | 17 ++++++++++-------
1 files changed, 10 insertions(+), 7 deletions(-)
diff --git a/libparted/labels/gpt.c b/libparted/labels/gpt.c
index 13d2e88..892e921 100644
--- a/libparted/labels/gpt.c
+++ b/libparted/labels/gpt.c
@@ -807,8 +807,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;
@@ -889,21 +889,24 @@ gpt_read (PedDisk * disk)
goto error_free_gpt;
- ptes_size = sizeof (GuidPartitionEntry_t) * gpt_disk_data->entry_count;
- ptes = (GuidPartitionEntry_t*) ped_malloc (ptes_size);
+ ptes_sectors = ped_div_round_up(gpt->SizeOfPartitionEntry *
+ gpt_disk_data->entry_count, disk->dev->sector_size);
+ ptes = ped_malloc (ptes_sectors * disk->dev->sector_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.5.6.3
_______________________________________________
parted-devel mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/parted-devel