fdisk - Use heads = 255 on file images
authorMatthew Dillon <dillon@apollo.backplane.com>
Tue, 15 Sep 2009 00:54:11 +0000 (17:54 -0700)
committerMatthew Dillon <dillon@apollo.backplane.com>
Tue, 15 Sep 2009 00:54:11 +0000 (17:54 -0700)
When operating on a file image use max values for sectors and heads in
order to match the case where the file might exceed the CHS limit.  By
convention the CHS fields are set to all 1's in this case.

If our sectors and heads are not set at max values then the all 1's case
will result in a geometry that overflows the originally specified sectors
and heads which can brick the BIOS.

sbin/fdisk/fdisk.c

index 93454f0..fbdad7d 100644 (file)
@@ -825,10 +825,17 @@ get_params(void)
     struct partinfo partinfo;  /* disk parameters */
     struct stat st;
 
+    /*
+     * NOTE: When faking up the CHS for a file image (e.g. for USB),
+     *      we must use max values.  If we do not then an overflowed
+     *       cylinder count will, by convention, set the CHS fields to
+     *       all 1's.  The heads and sectors in the CHS fields will then
+     *       exceed the basic geometry which can cause BIOSes to brick.
+     */
     if (ioctl(fd, DIOCGPART, &partinfo) == -1) {
        if (p_flag && fstat(fd, &st) == 0 && st.st_size) {
            sectors = 63;
-           heads = 16;
+           heads = 255;
            cylsecs = heads * sectors;
            cyls = st.st_size / 512 / cylsecs;
        } else {