[parted-devel] Patch: Fix gpt_read to read all of the partition entries correctly
Jim Meyering
jim at meyering.net
Sun Dec 21 08:17:30 UTC 2008
"Matthew S. Harris" <mharris312 at gmail.com> 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.
Thanks!
I don't want to block on test cases,
but it'd sure make it easier to take a patch that
comes with a small test case to exercise/demonstrate the fix.
For example, if you can construct a tiny image,
describe how to perturb it, and give a parted
command that misbehaves as a result, yet that works
with your patch, that'd be great.
> From 282be216499436242cdb3083c0e5d9b672db8682 Mon Sep 17 00:00:00 2001
> From: Matthew S. Harris <mharris312 at gmail.com>
> 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);
Does something already ensure that SizeOfPartitionEntry is sane?
i.e., what if the on-disk value is invalid?
Maybe add a sanity check, if there isn't one already.
> + ptes = ped_malloc (ptes_sectors * disk->dev->sector_size);
Before doing the malloc, ensure that the product does not overflow,
e.g.,
if (xalloc_oversized (ptes_sectors, disk->dev->sector_size)
goto ...;
> 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;
More information about the parted-devel
mailing list