[net.bugs.4bsd] 4.2bsd `mount' syscall bug

mouse@mcgill-vision.UUCP (der Mouse) (11/27/85)

The 4.2bsd mount() syscall appears to have a bug in it.

Symptom:
     After certain attempts to perform an invalid mount, the system will
hang and must be forcibly crashed and rebooted.

Repeat-by:
	mkdir foo
	/etc/mount /dev/null foo
     ("Block device required" error message)

     Now  the  next attempt to access /dev/null  will  hang the  process
attempting to do so.  For something like /dev/null, this  will hang most
of the system.

Problem:
     In sys/ufs_mount.c, when getmdev() detects certain  errors, it will
return without unlocking the inode in question.

Fix:
     Apply  the following context  diffs to  sys/ufs_mount.c.  Remember,
line number figures are for comparison only.  Your line numbers may vary
depending on  your coding style and  degree of kernel hacking.   Highway
mileage will likely be lower.

*** ufs_mount.c		Wed Nov 27 04:21:53 1985
--- ufs_mount.c=	Wed Nov  6 01:20:57 1985
***************
*** 266,272
  	if (ip == NULL)
  		return (u.u_error);
  	if ((ip->i_mode&IFMT) != IFBLK)
! 	 { iput(ip); return(ENOTBLK); }
  	dev = (dev_t)ip->i_rdev;
  	if (major(dev) >= nblkdev)
  	 { iput(ip); return(ENXIO); }

--- 266,272 -----
  	if (ip == NULL)
  		return (u.u_error);
  	if ((ip->i_mode&IFMT) != IFBLK)
! 		return (ENOTBLK);
  	dev = (dev_t)ip->i_rdev;
  	if (major(dev) >= nblkdev)
  		return (ENXIO);
***************
*** 269,275
  	 { iput(ip); return(ENOTBLK); }
  	dev = (dev_t)ip->i_rdev;
  	if (major(dev) >= nblkdev)
! 	 { iput(ip); return(ENXIO); }
  	iput(ip);
  	*pdev = dev;
  	return (0);

--- 269,275 -----
  		return (ENOTBLK);
  	dev = (dev_t)ip->i_rdev;
  	if (major(dev) >= nblkdev)
! 		return (ENXIO);
  	iput(ip);
  	*pdev = dev;
  	return (0);
-- 
					der Mouse

USA: {ihnp4,decvax,akgua,etc}!utcsri!mcgill-vision!mouse
     philabs!micomvax!musocs!mcgill-vision!mouse
Europe: mcvax!seismo!cmcl2!philabs!micomvax!musocs!mcgill-vision!mouse

Hacker: One responsible for destroying /
Wizard: One responsible for recovering it afterward