From owner-freebsd-bugs Sun Oct 5 18:10:07 1997 Return-Path: Received: (from root@localhost) by hub.freebsd.org (8.8.7/8.8.7) id SAA21902 for bugs-outgoing; Sun, 5 Oct 1997 18:10:07 -0700 (PDT) (envelope-from owner-freebsd-bugs) Received: (from gnats@localhost) by hub.freebsd.org (8.8.7/8.8.7) id SAA21896; Sun, 5 Oct 1997 18:10:02 -0700 (PDT) (envelope-from gnats) Resent-Date: Sun, 5 Oct 1997 18:10:02 -0700 (PDT) Resent-Message-Id: <199710060110.SAA21896@hub.freebsd.org> Resent-From: gnats (GNATS Management) Resent-To: freebsd-bugs Resent-Reply-To: FreeBSD-gnats@FreeBSD.ORG, mika@cs.caltech.edu Received: (from nobody@localhost) by hub.freebsd.org (8.8.7/8.8.7) id SAA21699; Sun, 5 Oct 1997 18:07:49 -0700 (PDT) (envelope-from nobody) Message-Id: <199710060107.SAA21699@hub.freebsd.org> Date: Sun, 5 Oct 1997 18:07:49 -0700 (PDT) From: mika@cs.caltech.edu To: freebsd-gnats-submit@FreeBSD.ORG X-Send-Pr-Version: www-1.0 Subject: bin/4700: /usr/bin/rdist handles hard links incorrectly when rdisting from a different directory Sender: owner-freebsd-bugs@FreeBSD.ORG X-Loop: FreeBSD.org Precedence: bulk >Number: 4700 >Category: bin >Synopsis: /usr/bin/rdist handles hard links incorrectly when rdisting from a different directory >Confidential: no >Severity: serious >Priority: medium >Responsible: freebsd-bugs >State: open >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Sun Oct 5 18:10:01 PDT 1997 >Last-Modified: >Originator: Mika Nystrom >Organization: California Institute of Technology, Department of Computer Science >Release: FreeBSD-CURRENT 3.0, at most a few days old >Environment: FreeBSD obelix.cs.caltech.edu 3.0-CURRENT FreeBSD 3.0-CURRENT #0: Wed Oct 1 20:09:28 PDT 1997 mika@obelix.cs.caltech.edu:/usr/src/sys/compile/P6SERVER_2CPU_256MB i386 >Description: If a directory that is being rdisted contains links (hard or symbolic), rdist translates the source of the link (as it would any file) using the "install" keyworkd in the Distfile. However, it leaves the link target the same as on the server system. For symbolic links, this is arguably the Right Thing To Do, but it is clearly Wrong for hard links. This breaks: /usr/cit_install/root/bin -> ${TEMPCLIENTS} install /bin; (We want the flexibility of running different releases on the server and clients.) We need to use: /bin -> ${TEMPCLIENTS} install /bin; which is non-optimal. >How-To-Repeat: Should be obvious from the description. >Fix: The fix we are using is to make sure the absolute pathnames are the same on server and client. A better fix would be to fix rdist; I don't know the structure of the code well enough to say exactly how, but I can point to where the problem is: It involves (I think) /usr/src/usr.bin/rdist/server.c: 34 #ifndef lint 35 static char sccsid[] = "@(#)server.c 8.1 (Berkeley) 6/9/93"; 36 #endif /* not lint */ 451 if (stb.st_nlink > 1) { 452 struct linkbuf *lp; 453 454 if ((lp = savelink(&stb)) != NULL) { 455 /* install link */ 456 if (*lp->target == 0) 457 (void) snprintf(buf, sizeof(buf), "k%o %s %s\n", opts, 458 lp->pathname, rname); 459 else 460 (void) snprintf(buf, sizeof(buf), "k%o %s/%s %s\ n", 461 opts, lp->target, lp->pathname, rname); 462 if (debug) 463 printf("buf = %s", buf); 464 (void) write(rem, buf, strlen(buf)); 465 (void) response(); 466 return; 467 } 468 } (The "k" command causes the server to execute hardlink() on the arguments.) The arguments need to be fixed so that both are translated in accordance with the rules used to translate pathnames of files. >Audit-Trail: >Unformatted: