[PATCH] Improve support for mac partition tables with logical sector size != 512

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

 



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


[Index of Archives]     [Kickstart]     [Fedora Users]     [Fedora Legacy List]     [Fedora Maintainers]     [Fedora Desktop]     [Fedora SELinux]     [Big List of Linux Books]     [Yosemite News]     [Yosemite Photos]     [KDE Users]     [Fedora Tools]
  Powered by Linux