Subject: kern/1513: msdosfs panics (locking against myself) with mv foo.xxx foo.xxx.~1~
To: None <gnats-bugs@gnats.netbsd.org>
From: John Kohl <jtk@kolvir.arlington.ma.us>
List: netbsd-bugs
Date: 09/25/1995 23:16:13
>Number:         1513
>Category:       kern
>Synopsis:       msdosfs panics (locking against myself) with mv foo.xxx foo.xxx.~1~
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people (Kernel Bug People)
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Sep 26 00:50:04 1995
>Last-Modified:
>Originator:     John Kohl
>Organization:
NetBSD Kernel Hackers `R` Us
>Release:        NetBSD-current, roughly 1995/09/22
>Environment:
	
System: NetBSD pattern 1.0A NetBSD 1.0A (PATTERN) #128: Mon Sep 25 23:09:21 EDT 1995 jtk@pattern:/u1/NetBSD-current/src/sys/arch/i386/compile/PATTERN i386


>Description:
in msdosfs, this will panic a system with DIAGNOSTIC or hang a process
without DIAGNOSTIC:
	% mv foo.xxx foo.xxx.~1~
>How-To-Repeat:
do that
>Fix:
===================================================================
RCS file: RCS/msdosfs_vnops.c,v
retrieving revision 1.1
diff -c -r1.1 msdosfs_vnops.c
*** msdosfs_vnops.c	1995/09/26 02:42:21	1.1
--- msdosfs_vnops.c	1995/09/26 03:08:47
***************
*** 876,882 ****
  		vrele(fvp);
  		return (error);
  	}
! 
  	/*
  	 * Convert the filename in tcnp into a dos filename. We copy this
  	 * into the denode and directory entry for the destination
--- 876,903 ----
  		vrele(fvp);
  		return (error);
  	}
! 	/*
! 	 * Check for rename onto itself.  e.g. rename("foo.emu", "foo.emu.~1~")
! 	 * which appears to the vnode layer as just like renaming one
! 	 * hardlinked file onto the other.  It happens here due to name
! 	 * mapping.
! 	 * (Can it happen due to hard links in a corrupted file system?
! 	 * should we worry about that?)
! 	 */
! 	if (fvp == tvp) {
! 	    /*
! 	     * the "to" name is valid, but so is the "from" name.
! 	     * what should we return as an error code?
! 	     * 0 is not quite right--the source still exists and the user
! 	     * may have uttered different file names.  However, it's probably
! 	     * the closest to correct.
! 	     * 
! 	     * maybe EMLINK?
! 	     */
! 	    error = 0 /*EMLINK*/;
! 	    goto abortit;
! 	}
! 	    
  	/*
  	 * Convert the filename in tcnp into a dos filename. We copy this
  	 * into the denode and directory entry for the destination

>Audit-Trail:
>Unformatted: