Date: Tue, 15 Oct 2002 12:53:25 -0700 (PDT) From: Nate Lawson <nate@root.org> To: Poul-Henning Kamp <phk@critter.freebsd.dk> Cc: current@freebsd.org Subject: Re: GEOM/fdisk/USB drive problem Message-ID: <Pine.BSF.4.21.0210151251250.37181-200000@root.org> In-Reply-To: <31480.1034710602@critter.freebsd.dk>
next in thread | previous in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
On Tue, 15 Oct 2002, Poul-Henning Kamp wrote:
> In message <Pine.BSF.4.21.0210151222400.36779-100000@root.org>, Nate Lawson wri
> tes:
> >fdisk against my USB flash drive crashes with divide by zero. It turns
> >out that get_params() starts with some default values (since there is
> >no disklabel) and then runs some ioctls: DIOCGFWSECTORS and DIOCGFWHEADS.
> >
> >The problem is that fdisk checks the error from that ioctl and then
> >happily uses whatever parameters it returned. My question is, should I
> >add the error checking in userland (error == 0 && sector != 0) or in
> >g_dev_ioctl? IMO, it should be in g_dev_ioctl so that we only have to
> >validate the data in one place instead of multiple utilities (fdisk,
> >disklabel, ...?)
>
> I really think it belongs in userland and not in the kernel.
>
> The "FW" values are advisory, and if they are not there or not
> sensible, userland should cope.
>
> I could agree to make g_dev_ioctl fail the ioctl with some errno
> if they came back as zero, but not substituting another value.
The attached patch makes everything work fine for my drive (64 MB USB
flash).
-Nate
fdisk: can't get disk parameters on /dev/da0; supplying dummy ones
******* Working on device /dev/da0 *******
parameters extracted from in-core disklabel are:
cylinders=129024 heads=1 sectors/track=1 (1 blks/cyl)
Figures below won't work with BIOS for partitions not in cyl 1
parameters to be used for BIOS calculations are:
cylinders=129024 heads=1 sectors/track=1 (1 blks/cyl)
Media sector size is 512
Warning: BIOS sector numbering starts with sector 1
Information from DOS bootblock is:
The data for partition 1 is:
sysid 6 (0x06),(Primary 'big' DOS (>= 32MB))
start 32, size 128480 (62 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 1;
end: cyl 250/ head 15/ sector 32
The data for partition 2 is:
<UNUSED>
The data for partition 3 is:
<UNUSED>
The data for partition 4 is:
<UNUSED>
[-- Attachment #2 --]
Index: sys/geom/geom_dev.c
===================================================================
RCS file: /home/ncvs/src/sys/geom/geom_dev.c,v
retrieving revision 1.25
diff -u -r1.25 geom_dev.c
--- sys/geom/geom_dev.c 7 Oct 2002 06:25:26 -0000 1.25
+++ sys/geom/geom_dev.c 15 Oct 2002 12:46:35 -0000
@@ -245,15 +245,23 @@
switch (cmd) {
case DIOCGSECTORSIZE:
error = g_io_getattr("GEOM::sectorsize", cp, &i, data);
+ if (error == 0 && *(u_int *)data == 0)
+ error = EINVAL;
break;
case DIOCGMEDIASIZE:
error = g_io_getattr("GEOM::mediasize", cp, &i, data);
+ if (error == 0 && *(u_int *)data == 0)
+ error = EINVAL;
break;
case DIOCGFWSECTORS:
error = g_io_getattr("GEOM::fwsectors", cp, &i, data);
+ if (error == 0 && *(u_int *)data == 0)
+ error = EINVAL;
break;
case DIOCGFWHEADS:
error = g_io_getattr("GEOM::fwheads", cp, &i, data);
+ if (error == 0 && *(u_int *)data == 0)
+ error = EINVAL;
break;
case DIOCGFRONTSTUFF:
error = g_io_getattr("GEOM::frontstuff", cp, &i, data);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.4.21.0210151251250.37181-200000>
