Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 16 Jan 2001 19:45:37 +0100 (CET)
From:      esk@ira.uka.de
To:        FreeBSD-gnats-submit@freebsd.org
Subject:   bin/24390: Replacing old dir-symlinks when using /bin/ln
Message-ID:  <200101161845.f0GIjbV02366@i30nb2.ira.uka.de>

next in thread | raw e-mail | index | archive | help

>Number:         24390
>Category:       bin
>Synopsis:       Replacing old dir-symlinks when using /bin/ln
>Confidential:   no
>Severity:       non-critical
>Priority:       medium
>Responsible:    freebsd-bugs
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Tue Jan 16 10:50:01 PST 2001
>Closed-Date:
>Last-Modified:
>Originator:     Espen Skoglund
>Release:        FreeBSD 4.2-STABLE i386
>Organization:
Karlsruhe Inversity
>Environment:

	

>Description:

I'm wondering about the semantics of the replacement functionality in `ln'
when the file to be replaced is a symlink to a directory.  I would have
thought that this should behave in the same manner as if the target of
`ln' was a normal file (i.e., the old symlink would be deleted, and a new
link would be installed).  This is, however, not the case.  What happens
is that `ln' follows the symlink into the directory and tries to install
a symlink there instead.  Is this really the desired behaviour?

>How-To-Repeat:

; mkdir foo
; chmod a-w foo
; ln -sf foo bar
; ln -sf foo bar
ln: bar/foo: Permission denied

>Fix:

--- /usr/src/bin/ln/ln.c	Mon Sep 18 04:07:11 2000
+++ ln.c	Tue Jan 16 19:27:41 2001
@@ -162,7 +162,8 @@
 	}
 
 	/* If the source is a directory, append the target's name. */
-	if (isdir || ((exists = !stat(source, &sb)) && S_ISDIR(sb.st_mode))) {
+	if ((isdir || ((exists = !stat(source, &sb)) && S_ISDIR(sb.st_mode)))
+	    && !(!lstat(source, &sb) && S_ISLNK(sb.st_mode))) {
 		if ((p = strrchr(target, '/')) == NULL)
 			p = target;
 		else

>Release-Note:
>Audit-Trail:
>Unformatted:


To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-bugs" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200101161845.f0GIjbV02366>