>Submitter-Id: net >Originator: Andy Cedilnik >Organization: net >Confidential: yes >Synopsis: CVS problem when repository soft-link >Severity: non-critical >Priority: medium >Category: cvs >Class: sw-bug >Release: 1.11.2 >Environment: System: Linux xanth.kitwarein.com 2.4.18 #6 SMP Tue Jun 11 14:37:02 EDT 2002 i686 Pentium III (Coppermine) GenuineIntel GNU/Linux Architecture: i686
>Description: When cvs repository is a softlink, cvs cannot create lock. The assertion in lock.c line 177 fails. The problem is that it compares the link path as a root of real path. This fails. It should convert link path to real path first. However this only happens sometimes, so the check should be made first wether real path is necessary. >How-To-Repeat: Setup cvs server. The root of all cvs repositories is /cvsroot. Create a cvs repository in let say /tmp/foo. Create softlink for /tmp/foo in /cvsroot. Try to checkout /cvsroot/foo. This should work. Commit file in /cvsroot/foo. Branch file in /cvsroot/foo. Tag branch in /cvsroot/foo. Try to checkout tagged version of branch of /cvsroot/foo. >Fix: This is a patch: --- ./lock.c 2001-09-26 14:54:09.000000000 -0400 +++ ../../../../cvs-1.11.2/src/lock.c 2002-10-25 13:28:54.000000000 -0400 @@ -169,16 +169,30 @@ lock_name (repository, name) { struct stat sb; mode_t new_mode = 0; + char buffer[PATH_MAX]; + char *dir; /* The interesting part of the repository is the part relative to CVSROOT. */ assert (current_parsed_root != NULL); assert (current_parsed_root->directory != NULL); - assert (strncmp (repository, current_parsed_root->directory, - strlen (current_parsed_root->directory)) == 0); - short_repos = repository + strlen (current_parsed_root->directory) + 1; + dir = current_parsed_root->directory; - if (strcmp (repository, current_parsed_root->directory) == 0) + /* If the dir is not in a subdirectory of repository, maybe + the repository is a soft link. Check for that case. */ + if ( !strncmp (repository, dir, + strlen (dir)) == 0) + { + if ( realpath(current_parsed_root->directory, buffer) ) + { + dir = buffer; + } + } + assert(strncmp (repository, dir, + strlen (dir)) == 0); + short_repos = repository + strlen (dir) + 1; + + if (strcmp (repository, dir) == 0) short_repos = "."; else assert (short_repos[-1] == '/'); _______________________________________________ Bug-cvs mailing list [EMAIL PROTECTED] http://mail.gnu.org/mailman/listinfo/bug-cvs