]> git.ipfire.org Git - thirdparty/util-linux.git/commitdiff
fdisk: sgi: abort on HDIO_GETGEO failure
authorDavidlohr Bueso <dave@gnu.org>
Sun, 6 May 2012 12:10:25 +0000 (14:10 +0200)
committerKarel Zak <kzak@redhat.com>
Thu, 10 May 2012 09:40:21 +0000 (11:40 +0200)
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():

$> 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@gnu.org>
Signed-off-by: Karel Zak <kzak@redhat.com>
fdisk/fdisksgilabel.c

index 822f55d971815882ebfc151cb9c74755aa7ad06f..5e851bc8e99f427ddd9031cef1906cee0ea7f7b2 100644 (file)
@@ -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, _("HDIO_GETGEO ioctl failed on %s"), disk_device);
+
+       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);
        }
 #endif
        for (i = 0; i < 4; i++) {