wescott@sauron.Columbia.NCR.COM (Mike Wescott) (01/09/87)
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