Date: Sat, 17 May 2003 17:18:57 +1000 (EST) From: Bruce Evans <bde@zeta.org.au> To: Yar Tikhiy <yar@comp.chem.msu.su> Cc: FreeBSD-gnats-submit@freebsd.org Subject: Re: kern/52338: fd(4) floppy disk driver & non-blocking I/O Message-ID: <20030517165718.B15076@gamplex.bde.org> In-Reply-To: <200305161646.h4GGkdDS000677@stylish.chem.msu.su> References: <200305161646.h4GGkdDS000677@stylish.chem.msu.su>
next in thread | previous in thread | raw e-mail | index | archive | help
On Fri, 16 May 2003, Yar Tikhiy wrote: > >Description: > > If /dev/fdX has been opened in non-blocking mode, the > inserted floppy type will never be autoselected. So trying > to get its parameters through DIOCGSECTORSIZE or DIOCGMEDIASIZE > will cause panic on dereferencing the NULL fd->ft pointer. > And reading from or writing to its descriptor will result > in the ENXIO (Device not configured) error. I made the obvious quick for for the null pointer panics when they were implemented: %%% Index: fd.c =================================================================== RCS file: /home/ncvs/src/sys/isa/fd.c,v retrieving revision 1.244 diff -u -2 -r1.244 fd.c --- fd.c 11 Jan 2003 20:10:41 -0000 1.244 +++ fd.c 11 Jan 2003 21:02:32 -0000 @@ -2623,12 +2788,22 @@ * FD_NONBLOCK still being set. */ - switch (cmd) { +#ifdef TEST_LABELLING + /* XXX only some slice ioctls are non-blocking. */ + error = dsioctl(dev, cmd, addr, flag, &fd->slices); + if (error != ENOIOCTL) + return (error); +#endif + switch (cmd) { case DIOCGMEDIASIZE: - *(off_t *)addr = (128 << (fd->ft->secsize)) * fd->ft->size; + if (fd->ft == 0) + return (ENXIO); + *(off_t *)addr = (128 << fd->ft->secsize) * fd->ft->size; return (0); case DIOCGSECTORSIZE: - *(u_int *)addr = 128 << (fd->ft->secsize); + if (fd->ft == 0) + return (ENXIO); + *(u_int *)addr = 128 << fd->ft->secsize; return (0); %%% Other changes in this patch: - local code (TEST_LABELLING). - fix 2 style bugs (excessive parentheses). Style bugs in this patch: - '0' is used for a null pointer constant to give bug for bug compatibility with other checks for fd->ft being a null pointer. Not autoselecting for the O_NONBLOCK case seems to be a feature. Autoselecting requires even more blocking than does starting the motor, and it would be just bogus to autoselect for an open whose purpose is to set the type. fd->ft may be NULL for other reasons, so the null pointer checks are needed no matter how O_NONBLOCK is handled. Bruce
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20030517165718.B15076>