On Sun, 2012-05-06 at 20:17 +0200, Petr Uzel wrote: > On Sun, May 06, 2012 at 02:10:25PM +0200, Davidlohr Bueso wrote: > > From: Davidlohr Bueso <dave@xxxxxxx> > > > > When the HDIO_GETGEO ioctl fails on non IRIX/MIPS platforms (ie: > > inappropriate ioctl for device) the variables that describe the > > geometry are compromissed. One clear example is a division by 0 bug > > because the cylinder size is 0 is verify_sgi(): > > I agree with the change, however I think that more descriptive error > message should be printed; see below. > > > > > $> fdisk sgi.img > > Welcome to fdisk (util-linux 2.21.392-4b1c). > > > > ... > > > > Command (m for help): x > > > > Expert command (m for help): g > > Building a new SGI disklabel. > > Partition 11 of type SGI volume and of size 7.9 MiB is set > > Floating point exception > > > > Fix this by simply exiting the program instead of leaving it in a vulnerable state. > > > > Signed-off-by: Davidlohr Bueso <dave@xxxxxxx> > > --- > > fdisk/fdisksgilabel.c | 39 ++++++++++++++++++++------------------- > > 1 files changed, 20 insertions(+), 19 deletions(-) > > > > diff --git a/fdisk/fdisksgilabel.c b/fdisk/fdisksgilabel.c > > index 822f55d..b61f102 100644 > > --- a/fdisk/fdisksgilabel.c > > +++ b/fdisk/fdisksgilabel.c > > @@ -705,25 +705,26 @@ create_sgilabel(void) > > res = blkdev_get_sectors(fd, &llsectors); > > > > #ifdef HDIO_GETGEO > > - if (!ioctl(fd, HDIO_GETGEO, &geometry)) { > > - heads = geometry.heads; > > - sectors = geometry.sectors; > > - if (res == 0) { > > - /* the get device size ioctl was successful */ > > - unsigned long long llcyls; > > - llcyls = llsectors / (heads * sectors * sec_fac); > > - cylinders = llcyls; > > - if (cylinders != llcyls) /* truncated? */ > > - cylinders = ~0; > > - } else { > > - /* otherwise print error and use truncated version */ > > - cylinders = geometry.cylinders; > > - fprintf(stderr, > > - _("Warning: BLKGETSIZE ioctl failed on %s. " > > - "Using geometry cylinder value of %d.\n" > > - "This value may be truncated for devices" > > - " > 33.8 GB.\n"), disk_device, cylinders); > > - } > > + if (ioctl(fd, HDIO_GETGEO, &geometry) < 0) > > + err(EXIT_FAILURE, _("ioctl failed on %s"), disk_device); > > s/"ioctl failed..."/"HDIO_GETGEO ioctl failed..." I don't care either way - perhaps even a "cannot get geometry" message. Karel, its up to you. Thanks for looking into this patchet! - Davidlohr > > [SNIP] > > Petr > > -- > Petr Uzel > IRC: ptr_uzl @ freenode -- To unsubscribe from this list: send the line "unsubscribe util-linux" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html