[parted-devel] [PATCH] Make "mklabel amiga" work also when DEBUG is not enabled.

David Cantrell dcantrell at redhat.com
Tue Jun 5 14:46:45 UTC 2007


On Tue, 2007-06-05 at 16:00 +0200, Jim Meyering wrote:
> I turned off DEBUG and discovered test failures that its
> bogus always-initialize-malloc'd-memory policy had been hiding:
> 
> 	Make "mklabel amiga" work also when DEBUG is not enabled.
> 	(amiga_write): Initialize all of "->disk_specific" buffer.
> 	Avoid buffer overrun when initializing "TABLE".
> 
> diff --git a/libparted/labels/rdb.c b/libparted/labels/rdb.c
> index 483a292..06d1f8b 100644
> --- a/libparted/labels/rdb.c
> +++ b/libparted/labels/rdb.c
> @@ -27,6 +27,10 @@
>  #include <parted/debug.h>
>  #include <parted/endian.h>
>  
> +#ifndef MAX
> +# define MAX(a,b) ((a) < (b) ? (b) : (a))
> +#endif
> +
>  #if ENABLE_NLS
>  #  include <libintl.h>
>  #  define _(String) dgettext (PACKAGE, String)
> @@ -656,6 +660,11 @@ amiga_write (const PedDisk* disk)
>  	/* Let's read the rdb */
>  	if ((rdb_num = _amiga_find_rdb (disk->dev, rdb)) == AMIGA_RDB_NOT_FOUND) {
>  		rdb_num = 2;
> +		size_t pb_size = sizeof (struct PartitionBlock);
> +                /* Initialize only the part that won't be copied over
> +                   with a partition block in amiga_read.  */
> +		memset ((char *)(RDSK(disk->disk_specific)) + pb_size,
> +			0, PED_SECTOR_SIZE_DEFAULT - pb_size);
>  	} else {
>  		memcpy (RDSK(disk->disk_specific), rdb, PED_SECTOR_SIZE_DEFAULT);
>  	}
> @@ -668,13 +677,19 @@ amiga_write (const PedDisk* disk)
>  	last_hb = (PedSector) PED_BE32_TO_CPU (rdb->rdb_RDBBlocksHi);
>  	last_used_hb = (PedSector) PED_BE32_TO_CPU (rdb->rdb_HighRDSKBlock);
>  
> -	/* let's allocate a free block table and initialize it */
> -	if (!(table = ped_malloc ((last_hb - first_hb + 1) * sizeof(uint32_t))))
> +	/* Allocate a free block table and initialize it.
> +	   There must be room for at least RDB_NUM + 2 entries, since
> +	   the first RDB_NUM+1 entries get IDNAME_RIGIDDISK, and the
> +	   following one must have LINK_END to serve as sentinel.  */
> +	size_t tab_size = 2 + MAX (last_hb - first_hb, rdb_num);
> +	if (!(table = ped_malloc (tab_size * sizeof *table)))
>  		return 0;
>  
> -	memset(table, 0xff, (last_hb - first_hb + 1) * sizeof(uint32_t));
> -	for (i = 0; i<=rdb_num; i++) table[i] = IDNAME_RIGIDDISK;
> -	
> +	for (i = 0; i <= rdb_num; i++)
> +		table[i] = IDNAME_RIGIDDISK;
> +	for (     ; i < tab_size; i++)
> +		table[i] = LINK_END;
> +
>  	/* Let's allocate a partition block */
>  	if (!(block = ped_malloc (PED_SECTOR_SIZE_DEFAULT))) {
>  		ped_free (table);
> 

ACK

-- 
David Cantrell <dcantrell at redhat.com>
Red Hat / Westford, MA
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 189 bytes
Desc: This is a digitally signed message part
Url : http://lists.alioth.debian.org/pipermail/parted-devel/attachments/20070605/f57a6ba0/attachment.pgp 


More information about the parted-devel mailing list