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 appears to be a normal condition on disks in the wild that are >2TB and use Mac partition tables (for example, the rescue image for the MacBookAir3,1), 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.2.2 _______________________________________________ Anaconda-devel-list mailing list Anaconda-devel-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/anaconda-devel-list