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 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list