chenr@tilt.FUN (Ray Chen) (12/02/84)
A correction to a 3:00 AM mistake. The idea was right but the code wasn't. Updated diffs follow. File: (whatever)/rcs/src/rcs/ci.c Description: ci allows names following -[nN] to have name delimiter characters such as white space in them. This results in later operations on the file producing errors. Repeat-by: ci -n"test 1" file ci -Ntest2 file Fix: The problem results from the fact the routine checkid() checks a symbol for validity but stops on symbol delimiting characters, the set of which which includes characters other than \0. ci, however, assumes that the entire name string is a valid symbol if no error occurs, so it installs the entire string as the name. This results in a situation where a name could be installed consisting of one valid symbol and an arbitrary number of possibly invalid symbols. The fix is simply to make ci use the information that checkid() returns -- a pointer to the character it stopped on, and to exit with a fatal error (and error message) if the delimiting character was a non-NULL one. Ray Chen princeton!tilt!chenr RCS file: RCS/ci.c,v retrieving revision 3.11 retrieving revision 3.9 diff -c -r3.11 -r3.9 *** /tmp/,RCSt1001960 Sat Dec 1 21:39:33 1984 --- /tmp/,RCSt2001960 Sat Dec 1 21:39:42 1984 *************** *** 2,8 * RCS checkin operation */ static char rcsid[]= ! "$Header: ci.c,v 3.11 84/12/01 21:31:17 chenr Exp $ Purdue CS"; /******************************************************************* * check revisions into RCS files ******************************************************************* --- 2,8 ----- * RCS checkin operation */ static char rcsid[]= ! "$Header: ci.c,v 3.9 83/02/15 15:25:44 wft Exp $ Purdue CS"; /******************************************************************* * check revisions into RCS files ******************************************************************* *************** *** 21,36 /* $Log: ci.c,v $ - * Revision 3.11 84/12/01 21:31:17 chenr - * Changed checkid() test in -[nN] handling section to test the character - * pointed to by the pointer and not the pointer itself. - * - * Revision 3.10 84/11/30 01:23:01 chenr - * Added char *nametest to force name in -[nN]name to be a one word - * symbol. If this isn't the case, then ci aborts with a fatal error. - * A quick and dirty fix to prevent names from being placed into the - * delta files that won't be properly handled later. - * * Revision 3.9 83/02/15 15:25:44 wft * original ci.c * --- 21,26 ----- /* $Log: ci.c,v $ * Revision 3.9 83/02/15 15:25:44 wft * original ci.c * *************** *** 136,142 { register int i; register char * sp, *tp; - char *nametest; char * cmdusage; /* holds command format */ char command[NCPPN+50]; /* holds diff commands */ char curdate[datelength];/* date for new delta */ --- 126,131 ----- { register int i; register char * sp, *tp; char * cmdusage; /* holds command format */ char command[NCPPN+50]; /* holds diff commands */ char curdate[datelength];/* date for new delta */ *************** *** 208,217 if ((*argv)[2]!='\0'){ if (symbol!=nil)warn("Redefinition of symbolic name"); symbol = (*argv)+2; ! nametest = checkid(symbol,' '); ! if (*nametest != NULL) ! faterror("Name %s must be one word", ! symbol); } else warn("Missing name for -n option"); break; --- 197,203 ----- if ((*argv)[2]!='\0'){ if (symbol!=nil)warn("Redefinition of symbolic name"); symbol = (*argv)+2; ! checkid(symbol,' '); } else warn("Missing name for -n option"); break; *************** *** 220,229 if ((*argv)[2]!='\0'){ if (symbol!=nil)warn("Redefinition of symbolic name"); symbol = (*argv)+2; ! nametest = checkid(symbol,' '); ! if (*nametest != NULL) ! faterror("Name %s must be one word", ! symbol); } else warn("Missing name for -N option"); break; --- 206,212 ----- if ((*argv)[2]!='\0'){ if (symbol!=nil)warn("Redefinition of symbolic name"); symbol = (*argv)+2; ! checkid(symbol,' '); } else warn("Missing name for -N option"); break;