[PATCH] sun: don't read freed memory
Jim Meyering
meyering at redhat.com
Fri Jun 26 19:24:14 UTC 2009
* 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
More information about the parted-devel
mailing list