This change may not be officially required currently,
(if dasd cannot ever call ops->partition_check)
but an upcoming dasd-specific change will make it essential
in order to avoid an actual NULL-dereference.

>From b5310d6391332aad5d297288f202d7c0c124ec4c Mon Sep 17 00:00:00 2001
From: Jim Meyering <meyer...@redhat.com>
Date: Mon, 23 Nov 2009 21:46:17 +0100
Subject: [PATCH] dasd: avoid NULL-dereference via 
disk->type->ops->partition_check

Commit f387fee8 added the new ops->partition_check() function,
and a <type>_partition_check function for each partition table
format _except_ dasd.  This change adds one for dasd, too.
* libparted/labels/dasd.c: Include "pt-tools.h".
(dasd_partition_check): New function.
* libparted/labels/pt-tools.c (ptt_partition_max_start_len): Add "dasd"
to the list of partition table type names for which the 32-bit
limits on starting sector and partition length apply.
Correct a comment.
Considering the 32-bit fields in "struct fdasd_hd_geometry",
it is safe to assume that larger offset or size is not possible.
---
 libparted/labels/dasd.c     |    8 ++++++++
 libparted/labels/pt-tools.c |    4 ++--
 2 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/libparted/labels/dasd.c b/libparted/labels/dasd.c
index 3f8147d..fc0695c 100644
--- a/libparted/labels/dasd.c
+++ b/libparted/labels/dasd.c
@@ -48,6 +48,7 @@
 #endif /* ENABLE_NLS */

 #include "misc.h"
+#include "pt-tools.h"

 #define PARTITION_LINUX_SWAP 0x82
 #define PARTITION_LINUX 0x83
@@ -106,6 +107,12 @@ static int dasd_partition_set_system (PedPartition* part,
                                                                          const 
PedFileSystemType* fs_type);
 static int dasd_alloc_metadata (PedDisk* disk);

+static bool
+dasd_partition_check (const PedPartition *part)
+{
+  return ptt_partition_max_start_len ("dasd", part);
+}
+
 static PedDiskOps dasd_disk_ops = {
        probe: dasd_probe,
        clobber: dasd_clobber,
@@ -132,6 +139,7 @@ static PedDiskOps dasd_disk_ops = {
        get_max_primary_partition_count: dasd_get_max_primary_partition_count,
        get_max_supported_partition_count: 
dasd_get_max_supported_partition_count,
        get_partition_alignment: dasd_get_partition_alignment,
+       partition_check:        dasd_partition_check,
 };

 static PedDiskType dasd_disk_type = {
diff --git a/libparted/labels/pt-tools.c b/libparted/labels/pt-tools.c
index 622cedd..8afec77 100644
--- a/libparted/labels/pt-tools.c
+++ b/libparted/labels/pt-tools.c
@@ -98,14 +98,14 @@ ptt_clear_sectors (PedDevice *dev, PedSector start, 
PedSector n)
 int
 ptt_partition_max_start_len (char const *label_type, const PedPartition *part)
 {
-  static char const *const max_32[] = {"msdos", "dvh"};
+  static char const *const max_32[] = {"msdos", "dvh", "dasd"};
   unsigned int i;

   for (i = 0; i < sizeof max_32 / sizeof *max_32; i++)
     {
       if (strcmp (label_type, max_32[i]) == 0)
         {
-          /* The starting sector length must fit in 32 bytes.  */
+          /* The length (in sectors) must fit in 32 bytes.  */
           if (part->geom.length > UINT32_MAX)
             {
               ped_exception_throw (PED_EXCEPTION_ERROR, PED_EXCEPTION_CANCEL,
--
1.6.6.rc0.203.g7074f

_______________________________________________
parted-devel mailing list
parted-devel@lists.alioth.debian.org
http://lists.alioth.debian.org/mailman/listinfo/parted-devel

Reply via email to