[parted-devel] [PATCH 3/9] Fix gpt_read to read all of the partition entries correctly.

Joel Granados jgranado at redhat.com
Tue Jun 9 07:57:52 UTC 2009


On Fri, Jun 05, 2009 at 02:43:21PM +0200, Jim Meyering wrote:
> Joel Granados Moreno wrote:
> 
> > From: Matthew S. Harris <mharris312 at gmail.com>
> >
> > * 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.
> 
> off-by-one comment:
> s/greater/no smaller than/

Yep,

> 
> > +	 */
> > +	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;
> 
> Sizes and counts must be unsigned, whenever possible.
> Please use size_t.
> 

ok.

> >  	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);
> 
> Please format continued expressions per GNU coding guidelines, e.g.,
> (i.e., aligned with relevant paren, operator at beginning of
> 2nd and subsequent continued line, not at end of preceding):
> 
>     	ptes_sectors = ped_div_round_up(gpt->SizeOfPartitionEntry
>                                         * gpt_disk_data->entry_count,
>                                         disk->dev->sector_size));
> 

sure

> > +	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);
> 
> Same here:
> 
>     		GuidPartitionEntry_t* pte
>                   = (GuidPartitionEntry_t*) (ptes + i
>                                              * gpt->SizeOfPartitionEntry);
> 
> Hmm... since ptes is a void* pointer,
> doesn't the above elicit a warning from gcc?
> void pointer arithmetic is not portable.
> You'll want to cast it to "(char *)" first.
> 
> Please ensure that your changes do not introduce new warnings,
> and that the result passes "make distcheck".

Very helpfull ^^^^^

> 
> >  		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;

-- 
Joel Andres Granados
Brno, Czech Republic, Red Hat.



More information about the parted-devel mailing list