bug-parted
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH] Improve support for mac partition tables with logical sector siz


From: Brian C. Lane
Subject: [PATCH] Improve support for mac partition tables with logical sector size != 512
Date: Fri, 17 Dec 2010 09:48:21 -0800

From: Peter Jones <address@hidden>

On mac partition tables which specify a sector size larger than the
physical sector size, we need to reallocate the buffer after we
determine the correct sector size.

This is a normal condition when CD is used with Apple partitions (for
example, the USB rescue stick for the MacBookAir3,1), and then an image
(analogous to an .iso image) is created, so also don't raise an exception in
_disk_analyse_block_size() when we find that.

Also simplify the code in _disk_analyse_block_size() a bit since there's no
reason to ever do the byteswapping more than once or convert everything to
512-byte multiples since we neither load nor store it that way.
---
 libparted/labels/mac.c |   44 ++++++++++++++++++++++++++------------------
 1 files changed, 26 insertions(+), 18 deletions(-)

diff --git a/libparted/labels/mac.c b/libparted/labels/mac.c
index 49a236e..418343e 100644
--- a/libparted/labels/mac.c
+++ b/libparted/labels/mac.c
@@ -643,35 +643,22 @@ _rawpart_get_partmap_size (MacRawPartition* raw_part, 
PedDisk* disk)
 static int
 _disk_analyse_block_size (PedDisk* disk, MacRawDisk* raw_disk)
 {
-       PedSector       block_size;
+       PedSector       block_size = PED_BE16_TO_CPU(raw_disk->block_size);
 
-       if (PED_BE16_TO_CPU (raw_disk->block_size) % 512) {
+       if (block_size % 512) {
 #ifndef DISCOVER_ONLY
                ped_exception_throw (
                        PED_EXCEPTION_ERROR,
                        PED_EXCEPTION_CANCEL,
                        _("Weird block size on device descriptor: %d bytes is "
                          "not divisible by 512."),
-                       (int) PED_BE16_TO_CPU (raw_disk->block_size));
+                       (int) block_size);
 #endif
                goto error;
        }
 
-       block_size = PED_BE16_TO_CPU (raw_disk->block_size) / 512;
-       if (block_size != disk->dev->sector_size / 512) {
-#ifndef DISCOVER_ONLY
-               if (ped_exception_throw (
-                       PED_EXCEPTION_WARNING,
-                       PED_EXCEPTION_IGNORE_CANCEL,
-                       _("The driver descriptor says the physical block size "
-                         "is %d bytes, but Linux says it is %d bytes."),
-                       (int) block_size * 512,
-                       (int) disk->dev->sector_size)
-                               != PED_EXCEPTION_IGNORE)
-                       goto error;
-#endif
-               disk->dev->sector_size = block_size * 512;
-       }
+       if (block_size != disk->dev->sector_size)
+               disk->dev->sector_size = block_size;
 
        return 1;
 
@@ -729,6 +716,7 @@ mac_read (PedDisk* disk)
        PedPartition*           part;
        int                     num;
        PedSector               ghost_size;
+       PedSector               sector_size;
        PedConstraint*          constraint_exact;
        int                     last_part_entry_num = 0;
 
@@ -746,8 +734,28 @@ mac_read (PedDisk* disk)
        if (!_check_signature (raw_disk))
                goto error;
 
+       sector_size = disk->dev->sector_size;
        if (!_disk_analyse_block_size (disk, raw_disk))
                goto error;
+
+       /* If dev->sector_size changed when we did ptt_read_sector(),
+          then the buffer size is wrong and we'll take a segfault
+          down the line unless we re-allocate it here. */
+       if (disk->dev->sector_size != sector_size) {
+               free(buf);
+               buf = 0;
+               if (!ptt_read_sector(disk->dev, 0, &buf))
+                       return 0;
+
+               MacRawDisk *raw_disk = (MacRawDisk *) buf;
+
+               if (!_check_signature (raw_disk))
+                       goto error;
+
+               if (!_disk_analyse_block_size (disk, raw_disk))
+                       goto error;
+       }
+
        if (!_disk_analyse_ghost_size (disk))
                goto error;
        ghost_size = mac_disk_data->ghost_size;
-- 
1.7.3.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]