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



The following reply was made to PR bin/37656; it has been noted by GNATS.

From: jnemeth%victoria.tc.ca@localhost (John Nemeth)
To: gnats-bugs%NetBSD.org@localhost, netbsd-bugs%NetBSD.org@localhost
Cc: 
Subject: Re: bin/37656: fdisk segfault on invalid MBR entries on non-x86 
geometry detection
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 = le32toh(part->mbrp_start)
 }                     + le32toh(part->mbrp_size) - 1;
 }         }
 } -       /* Sanity check the data against all zeroes */
 } -       if ((*cylinder == 0) && (*sector == 0) && (*head == 0))
 } +       /* Sanity check the data against cyl/sec/head zeroes */
 } +       if ((*cylinder == 0) || (*sector == 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.
 
 }-- End of excerpt from eau%phear.org@localhost
 



Home | Main Index | Thread Index | Old Index