kern/52338: fd(4) floppy disk driver & non-blocking I/O

Bruce Evans bde at zeta.org.au
Sat May 17 00:20:18 PDT 2003


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

From: Bruce Evans <bde at zeta.org.au>
To: Yar Tikhiy <yar at comp.chem.msu.su>
Cc: FreeBSD-gnats-submit at freebsd.org, freebsd-bugs at freebsd.org
Subject: Re: kern/52338: fd(4) floppy disk driver & non-blocking I/O
Date: Sat, 17 May 2003 17:18:57 +1000 (EST)

 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


More information about the freebsd-bugs mailing list