FYI, testing exposed problems with the new big-sector
support for sun partition tables.  Here's the fix I've just pushed:

>From 0fbe2ea59fa1281804fc2e7549b5d099614a0f5c Mon Sep 17 00:00:00 2001
From: Jim Meyering <[email protected]>
Date: Fri, 26 Jun 2009 21:24:14 +0200
Subject: [PATCH] sun: don't read freed memory

* libparted/labels/sun.c (_use_old_info): Rename from
_probe_and_use_old_info.  Don't read sector 0 here.
(sun_write): Read it here instead.
Write not a constant-sized 512-byte buffer, but the sector-sized
buffer just read above.
---
 libparted/labels/sun.c |   35 +++++++++++++++++++++--------------
 1 files changed, 21 insertions(+), 14 deletions(-)

diff --git a/libparted/labels/sun.c b/libparted/labels/sun.c
index 25db2b6..23c763e 100644
--- a/libparted/labels/sun.c
+++ b/libparted/labels/sun.c
@@ -384,23 +384,18 @@ sun_read (PedDisk* disk)

 #ifndef DISCOVER_ONLY
 static int
-_probe_and_use_old_info (const PedDisk* disk)
+_use_old_info (const PedDisk* disk, const void *sector_0)
 {
-       void *s0;
-       if (!ptt_read_sector (disk->dev, 0, &s0))
-               return 0;
-
-       SunRawLabel const *old_label = (void const *) s0;
+       SunRawLabel const *old_label = sector_0;

        if (old_label->info[0]
            && PED_BE16_TO_CPU (old_label->magic) == SUN_DISK_MAGIC) {
                SunDiskData *sun_specific = disk->disk_specific;
-               memcpy (&sun_specific->raw_label, s0,
+               memcpy (&sun_specific->raw_label, sector_0,
                         sizeof (sun_specific->raw_label));
-                verify (sizeof (sun_specific->raw_label) == 512); // FIXME
+                verify (sizeof (sun_specific->raw_label) == 512);
        }

-       free (s0);
        return 1;
 }

@@ -416,9 +411,18 @@ sun_write (const PedDisk* disk)
        PED_ASSERT (disk != NULL, return 0);
        PED_ASSERT (disk->dev != NULL, return 0);

-       if (!_probe_and_use_old_info (disk))
+       void *s0;
+       if (!ptt_read_sector (disk->dev, 0, &s0))
                return 0;

+       /* Calling _use_old_info here in sun_write
+          above seems wrong, because it modifies *DISK.
+          FIXME: maybe later.  */
+       if (!_use_old_info (disk, s0)) {
+                free (s0);
+               return 0;
+        }
+
        disk_data = (SunDiskData*) disk->disk_specific;
        label = &disk_data->raw_label;

@@ -478,11 +482,14 @@ sun_write (const PedDisk* disk)

        sun_compute_checksum (label);

-       if (!ped_device_write (disk->dev, label, 0, 1))
-               goto error;
-       return ped_device_sync (disk->dev);
+        verify (sizeof *label == 512);
+        memcpy (s0, label, sizeof *label);
+       bool write_ok = ped_device_write (disk->dev, s0, 0, 1);
+       free (s0);
+
+       if (write_ok)
+               return ped_device_sync (disk->dev);

-error:
        return 0;
 }
 #endif /* !DISCOVER_ONLY */
--
1.6.3.3.420.gd4b46

_______________________________________________
parted-devel mailing list
[email protected]
http://lists.alioth.debian.org/mailman/listinfo/parted-devel

Reply via email to