[Bug 283753] gpart: rejects MBR-formatted disks with partitions that include LBA 4294967295
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
Date: Mon, 30 Dec 2024 22:55:15 UTC
https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=283753 Bug ID: 283753 Summary: gpart: rejects MBR-formatted disks with partitions that include LBA 4294967295 Product: Base System Version: 15.0-CURRENT Hardware: Any OS: Any Status: New Severity: Affects Only Me Priority: --- Component: kern Assignee: bugs@FreeBSD.org Reporter: asomers@FreeBSD.org PROBLEM ======= On a disk of 2TiB or more (0x100000000 512B sectors), gpart will wrongly reject the partition table as corrupt if any partition's final LBA resides on the 0xffffffffth sector (sector 4294967295). gpart will refuse to create any device nodes, and print messages to dmesg like: GEOM_PART: partition 4 has end offset beyond last LBA: 4294967295 > 4294967294 GEOM_PART: integrity check failed (md0, MBR) STEPS TO REPRODUCE ================== On GNU/Linux, do these commands $ truncate -s 2199023255552 2t_file $ /usr/sbin/fdisk almost_2t_file At the interactive prompt, type these subcommands: > o > n > p > 1 > > > p Disk 2t_file: 2 TiB, 2199023255552 bytes, 4294967296 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: dos Disk identifier: 0x30b69544 Device Boot Start End Sectors Size Id Type 2t_file1 2048 4294967295 4294965248 2T 83 Linux Notice the end LBA of the partition is 4294967295. Now, on FreeBSD, try to attach gpart to this file, like this: $ sudo mdconfig -a -t vnode -f 2t_file md0 $ gpart show md0 gpart: No such geom: md0. $ dmesg | tail -n1 GEOM_PART: integrity check failed (md0, MBR) IMPACT ====== GNU/Linux's fdisk tool (tested on Debian 12) will allow creating a partition table with a primary partition that includes LBA 4294967295. Attempting to mount such a disk image on FreeBSD will fail with the above message. This bug is unlikely to effect any physical hard disks, since none were ever manufactured in 2 TiB capacities, and Linux refuses to allow a primary partition that includes LBA 4294967296 or greater. But it effects disk images of 2 TiB, and disk images of greater than 2 TiB with a partition table that only uses the first 2 TiB. WORKAROUND ========== Setting sysctl kern.geom.part.check_integrity=0 will workaround the problem. However, it will also disable other sanity checks that may be important. ENVIRONMENT =========== Tested on FreeBSD amd64 15.0-CURRENT as of 27-Dec-2024, and FreeBSD amd64 14.1-RELEASE. ANALYSIS ======== An MBR partition entry contains a 32-bit field for each partition's starting LBA and a 32-bit field for each partition's length in sectors. So a partition could theoretically start on LBA 0xffffffff and run for 0xffffffff sectors, meaning that it's last LBA would be 0x1fffffffd. But many (most?) tools reject such partitions. GNU/Linux, for example, will refuse to create a partition that ends on a sector higher than 4294967295. The logic in FreeBSD is found in the g_part_check_integrity function, which requires the partition's last LBA to be less than or equal to the disk's gpt_last value. That gpt_last value is not recorded in the MBR; it's inferred from the disk's mediasize. In the function g_part_mbr_create it's set to "MIN(pp->mediasize / pp->sectorsize, UINT32_MAX) - 1". That code was added in SVN r221972 in May 2011 when gpart's MBR support was first added. The older /sbin/fdisk tool did not attempt such integrity validation. I'm tempted to say that the logic in g_part_mbr_create is wrong, and the correct expression should be "MIN(pp->mediasize / pp->sectorsize - 1, UINT32_MAX)". That would fix this bug. However, I find similar expressions in the code for other partition table formats: BSD, BSD64, APM, EBR, and even GPT. But not, however, LDM. So I can't change it with confidence. -- You are receiving this mail because: You are the assignee for the bug.