NetBSD-Bugs archive

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

Re: bin/37656: fdisk segfault on invalid MBR entries on non-x86 geometry detection



On May 24,  8:17pm, Eric Auge wrote:
} 
} John Nemeth wrote:
} > The following reply was made to PR bin/37656; it has been noted by GNATS.
} >
} > From: jnemeth%victoria.tc.ca@localhost (John Nemeth)
} > Date: Tue, 1 Jan 2008 12:35:29 -0800
} >
} >  On Apr 18,  4:27am, eau%phear.org@localhost wrote:
} >  }
} >  } >Number:         37656
} >  } >Synopsis:       fdisk segfault on invalid MBR entries on non-x86 
geometry detection
} >  } >State:          open
} >  } >Class:          sw-bug
} >  } >Arrival-Date:   Tue Jan 01 16:20:00 +0000 2008
} >  } >Originator:     Eric Auge
} >  } >Release:        netbsd 4.0
} >  } >Environment:
} >  } NetBSD client 4.0_STABLE NetBSD 4.0_STABLE (GENERIC) #0: Fri Dec 28
} >  } 13:23:05 CET 2007
} >  } 
root%bearcave.no.phear.org@localhost:/usr/obj/sys/arch/cobalt/compile/GENERIC 
cobalt
} >  } >Description:
} >  } On a cobalt, after few install tests, I got the following
} >  }
} >  } # fdisk -S /dev/wd0
} >  } [1]   Trace/BPT trap          fdisk -S /dev/wd0
} >  }
} >  } I was unable to partition the hard drive in order to have a correct
} partitioning scheme for installing my cobalt.
} >  }
} >  } fdisk seems to make an almost correct sanity check on
} >  } get_mapping function except in some cases where head returned in the
}  MBR is 0 on 2 consecutives mappings while these values are trusted to make 
division, fdisk crash with a divide by zero problem.
} >  }
} >  } initial sanity check was the following line 1525 in fdisk.c:
} >  } [...]
} >  }     /* Sanity check the data against all zeroes */
} >  }     if ((*cylinder == 0) && (*sector == 0) && (*head == 0))
} >  }         return -1;
} >  } [...]
} >  } >How-To-Repeat:
} >  } have a fucked up MBR on your hardrive and try to install port-cobalt
} >  } >Fix:
} >  } --- fdisk.c     2008-01-01 11:18:07.000000000 +0100
} >  } +++ fdisk-new.c 2008-01-01 11:18:46.000000000 +0100
} >  } @@ -1541,8 +1541,8 @@
} >  }                 *absolute =3D le32toh(part->mbrp_start)
} >  }                     + le32toh(part->mbrp_size) - 1;
} >  }         }
} >  } -       /* Sanity check the data against all zeroes */
} >  } -       if ((*cylinder =3D=3D 0) && (*sector =3D=3D 0) && (*head == 0))
} >  } +       /* Sanity check the data against cyl/sec/head zeroes */
} >  } +       if ((*cylinder =3D=3D 0) || (*sector =3D=3D 0) || (*head == 0))
} >  }                 return -1;
} >  }         /* Sanity check the data against max values */
} >  }         if ((((*cylinder * MAXHEAD) + *head) * MAXSECTOR + *sector) < 
*absolute)
} >
} >       This change is wrong.  It is perfectly legal for cylinder and head
} >  to be 0.  This change would exclude any partition that starts on
} >  cylinder 0 from consideration, which is where the first partition
} >  normally starts.  It would also exclude any partition that starts with
} >  head 0 which is where primary partitions other then the first one
} >  normally start.  The effect is that you would most likely exclude all
} >  partitions.  The bug is in the code that tries to deduce the number of
} >  heads.  I'll have to think about how to fix this properly.
} 
} good to know, It was a quick hack in order to have fdisk working on
} port-cobalt while the installation was failing because the MBR
} was not correct apparently.
} 
} my understanding is that on non-x86 arch you check the MBR to guess the

     It does on x86 as well (see below and note that none of the head
numbers makes sense).

} geometry ? what about brand new harddrives, MBR must always be null no ?

     Not sure how this is handled, but yes the MBR would be all 0s.

P4-3679GHz: {1} fdisk
Disk: /dev/rwd1d
NetBSD disklabel disk geometry:
cylinders: 1453521, heads: 16, sectors/track: 63 (1008 sectors/cylinder)
total sectors: 1465149168

BIOS disk geometry:
cylinders: 1023, heads: 81, sectors/track: 63 (5103 sectors/cylinder)
total sectors: 1465149168

Partition table:
0: NetBSD (sysid 169)
    start 63, size 1465149105 (715405 MB, Cyls 0-287115/20/63), Active
1: <UNUSED>
2: <UNUSED>
3: <UNUSED>
Bootselector disabled.
Drive serial number: 2140322 (0x0020a8a2)

}-- End of excerpt from Eric Auge



Home | Main Index | Thread Index | Old Index