🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by Mike Wescott Fri, 09 Jan 1987 04:50
filename expansion bug in uux (Honey Danber) w/patch
#58
Author: Mike Wescott
Date: Fri, 09 Jan 1987 04:50
152 lines
4226 bytes
In the version of HDB uucp (BNU 2.0, I think), there are is a bug in the
way uux expands filenames in a command.  Sometimes what seems to be a valid
won't get properly expanded and the file shipped to the remote system.
uux treats arguments (other than the command argument) as filenames if it 
has a '!' in it; except in the case where the local system is explicitly
specified.  

	!~/x	becomes PUBDIR/x and the file is shipped to the remote
	<mysys>!~/x	becomes ~/x and the file is NOT shipped
	~/x		is not expanded (no bang, hence not a filename)

multiple <mysys>! prefixes are dropped, but not multiple ! prefixes.
The inconsistency is annoying but not severe.  In any case, the following
patch to getprm.c will drop multiple <mysys>! and/or multiple ! prefixes
and then send the file.

Are there any reasons (security holes perhaps) why this fix should not
be implemented???

	-Mike Wescott
	ncrcae!wescott


*** getprm.c.orig	Thu Jan  8 14:47:21 1987
--- getprm.c	Thu Jan  8 15:10:44 1987
***************
*** 92,97
  char *sys, *rest;
  {
  	register char *c, *n;
  
  	*sys = '\0';
  	if (*name == LQUOTE) {

--- 92,98 -----
  char *sys, *rest;
  {
  	register char *c, *n;
+ 	register int foundsys;
  
  	*sys = '\0';
  	foundsys = FALSE;
***************
*** 94,99
  	register char *c, *n;
  
  	*sys = '\0';
  	if (*name == LQUOTE) {
  		c = bal(name, RQUOTE);
  		name++;

--- 95,101 -----
  	register int foundsys;
  
  	*sys = '\0';
+ 	foundsys = FALSE;
  	if (*name == LQUOTE) {
  		c = bal(name, RQUOTE);
  		name++;
***************
*** 99,105
  		name++;
  		(void) strncpy(rest, name, c-name);
  		rest[c-name] = '\0';
! 		return(0);
  	}
  
  	for (n = name ;; n = c+1) { /* loop to get rid if initial Mynames */

--- 101,107 -----
  		name++;
  		(void) strncpy(rest, name, c-name);
  		rest[c-name] = '\0';
! 		return(FALSE);
  	}
  
  	for (n = name ;; n = c+1) { /* loop to get rid if initial Mynames */
***************
*** 105,111
  	for (n = name ;; n = c+1) { /* loop to get rid if initial Mynames */
  	    if ((c = strchr(n, '!')) == NULL) {
  		(void) strcpy(rest, n);
! 		return(0);
  	    }
  
  	    /*  ignore escaped '!' */

--- 107,113 -----
  	for (n = name ;; n = c+1) { /* loop to get rid if initial Mynames */
  	    if ((c = strchr(n, '!')) == NULL) {
  		(void) strcpy(rest, n);
! 		return(foundsys);
  	    }
  
  	    /*  ignore escaped '!' */
***************
*** 113,119
  		*(c-1) = '\0';
  		(void) strcpy(rest, n);
  		(void) strcat(rest, c);
! 		return(0);
  	    }
  
  	    *c = '\0';

--- 115,121 -----
  		*(c-1) = '\0';
  		(void) strcpy(rest, n);
  		(void) strcat(rest, c);
! 		return(foundsys);
  	    }
  
  	    *c = '\0';
***************
*** 117,123
  	    }
  
  	    *c = '\0';
! 	    if (EQUALS(n, Myname)) /* initial system is Myname */
  		continue;
  
  	    (void) strcpy(sys, n);

--- 119,126 -----
  	    }
  
  	    *c = '\0';
! 	    if (EQUALS(n, Myname) || (c == n)) { /* initial system is Myname */
! 		foundsys = TRUE;
  		continue;
  	    }
  
***************
*** 119,124
  	    *c = '\0';
  	    if (EQUALS(n, Myname)) /* initial system is Myname */
  		continue;
  
  	    (void) strcpy(sys, n);
  	    (void) strcpy(rest, ++c);

--- 122,128 -----
  	    if (EQUALS(n, Myname) || (c == n)) { /* initial system is Myname */
  		foundsys = TRUE;
  		continue;
+ 	    }
  
  	    (void) strcpy(sys, n);
  	    (void) strcpy(rest, ++c);
-- 
	-Mike Wescott
	 ncrcae!wescott
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads