rcs 5.8-1 checks out wrong version of file when using similar mark symbols

Richard Gribble richard@gandalfwizard.us
Mon Mar 26 19:30:00 GMT 2012


Using rcs 5.8-1:

Synopsis:
   Given two mark symbols, abc (version 1.1) and abcd (version 1.2),
   executing "co -rabc <file>" will check out version 1.2, when it
   should check out version 1.1.

I set the mark symbols as follows:
   rcs -nabc:1.1 -nabcd:1.2 <file>


I dug into it, and found the following (rcsrev.c):

01:  static char const *
02:  rev_from_symbol (struct cbuf const *id)
03:  /* Look up "id" in the list of symbolic names starting with pointer
04:     "GROK (symbols)", and return a pointer to the corresponding
05:     revision number.  Return NULL if not present.  */
06:  {
07:    for (struct link *ls = GROK (symbols); ls; ls = ls->next)
08:      {
09:        struct symdef const *d = ls->entry;
10:
11:        if (!strncmp (d->meaningful, id->string, id->size))
12:          return d->underlying;
13:      }
14:    return NULL;
15:  }

Note that line 11 tests the name of the requested mark symbol
(id->string) against each element of a linked-list (ls) containing all
the mark symbols for the file.  The problem is that it will only test
the first 'id->size' characters - so R25 (from the command line) matches
R25a (from the list) because the first three characters match and it
won't test any more than that (strncmp).

I recommend modifying line 11 as follows:
   if ((strlen(d->meaningful) == strlen(id->size)) && !strncmp
(d->meaningful, id->string, id->size))

Of course, since you now know that the two strings are the same size,
you could use strcmp - but that assumes that the && short-circuits, and
I don't know if that's guaranteed.

I went through the cygcheck.out file and replaced my user, company,
printer and host names with 'username', 'companydomain', 'printername'
and 'hostname'.  I also changed the UID and GID numbers.


Hope this is helpful,

Richard.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: cygcheck.out
Type: application/octet-stream
Size: 69410 bytes
Desc: not available
URL: <http://cygwin.com/pipermail/cygwin/attachments/20120326/a629b946/attachment.obj>
-------------- next part --------------
--
Problem reports:       http://cygwin.com/problems.html
FAQ:                   http://cygwin.com/faq/
Documentation:         http://cygwin.com/docs.html
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple


More information about the Cygwin mailing list