If the user has set his CVSROOT env variable and calls cvs in this
manner:

cvs co -d <repository> <module>

The current version will happily check the module out inside of 
the repository.

I've attached a patch that fixes this problem( It's not based on
the other checkout into the repository patch I got going at this
point in time. ).  I've also included a sanity.sh modification
that shows tests this case ;)

Please let me know if you have any suggestions/comments.

Thanks!

donald
Index: ChangeLog
===================================================================
RCS file: /home2/cvsroot/ccvs/src/ChangeLog,v
retrieving revision 1.2135
diff -c -r1.2135 ChangeLog
*** ChangeLog   23 May 2001 18:03:07 -0000      1.2135
--- ChangeLog   24 May 2001 17:08:21 -0000
***************
*** 1,3 ****
--- 1,11 ----
+ 2001-05-24  Donald Sharp <[EMAIL PROTECTED]>
+ 
+     * checkout.c:  Modified safe_location() to refuse checkout if
+     the -d option to co specifies inside of the repository.
+     * import.c:  New parameter to safe_location needed to be added.
+     * cvs.h:  New parameter to safe_location needed to be added.
+     * sanity.sh:  Test case to test for failure mode.
+ 
  2001-05-23  Larry Jones  <[EMAIL PROTECTED]>
  
        * checkout.c (checkout_proc): Don't build top_level_admin directory
Index: checkout.c
===================================================================
RCS file: /home2/cvsroot/ccvs/src/checkout.c,v
retrieving revision 1.99
diff -c -r1.99 checkout.c
*** checkout.c  23 May 2001 18:03:08 -0000      1.99
--- checkout.c  24 May 2001 17:08:21 -0000
***************
*** 248,254 ****
      }
  #endif
  
!     if (!cat && !safe_location()) {
          error(1, 0, "Cannot check out files into the repository itself");
      }
  
--- 248,254 ----
      }
  #endif
  
!     if (!cat && !safe_location( where )) {
          error(1, 0, "Cannot check out files into the repository itself");
      }
  
***************
*** 379,387 ****
     reasons, probably want to move them.  */
  
  int
! safe_location ()
  {
      char *current;
      char hardpath[PATH_MAX+5];
      size_t hardpath_len;
      int  x;
--- 379,388 ----
     reasons, probably want to move them.  */
  
  int
! safe_location ( char * where )
  {
      char *current;
+     char *where_location;
      char hardpath[PATH_MAX+5];
      size_t hardpath_len;
      int  x;
***************
*** 403,411 ****
--- 404,431 ----
      {
          hardpath[x] = '\0';
      }
+ 
      current = xgetwd ();
      if (current == NULL)
        error (1, errno, "could not get working directory");
+ 
+     if( where != NULL )
+     {
+       char *temp;
+       if( chdir( where ) != -1 )
+       {
+         where_location = xgetwd();
+         if( where_location == NULL )
+               error( 1, errno, "could not get working directory" );
+ 
+           if( chdir( current ) == -1 )
+               error( 1, errno, "Could not change directory" );
+ 
+           free( current );
+           current = where_location;
+         }
+     }
+ 
      hardpath_len = strlen (hardpath);
      if (strlen (current) >= hardpath_len
        && strncmp (current, hardpath, hardpath_len) == 0)
Index: cvs.h
===================================================================
RCS file: /home2/cvsroot/ccvs/src/cvs.h,v
retrieving revision 1.221
diff -c -r1.221 cvs.h
*** cvs.h       4 May 2001 16:36:34 -0000       1.221
--- cvs.h       24 May 2001 17:08:21 -0000
***************
*** 380,386 ****
  extern cvsroot_t *current_parsed_root;
  
  extern char *emptydir_name PROTO ((void));
! extern int safe_location PROTO ((void));
  
  extern int trace;             /* Show all commands */
  extern int noexec;            /* Don't modify disk anywhere */
--- 380,386 ----
  extern cvsroot_t *current_parsed_root;
  
  extern char *emptydir_name PROTO ((void));
! extern int safe_location PROTO ((char *));
  
  extern int trace;             /* Show all commands */
  extern int noexec;            /* Don't modify disk anywhere */
Index: import.c
===================================================================
RCS file: /home2/cvsroot/ccvs/src/import.c,v
retrieving revision 1.122
diff -c -r1.122 import.c
*** import.c    6 Feb 2001 15:29:43 -0000       1.122
--- import.c    24 May 2001 17:08:21 -0000
***************
*** 278,284 ****
      }
  #endif
  
!     if (!safe_location ())
      {
        error (1, 0, "attempt to import the repository");
      }
--- 278,284 ----
      }
  #endif
  
!     if (!safe_location ( NULL ))
      {
        error (1, 0, "attempt to import the repository");
      }
Index: sanity.sh
===================================================================
RCS file: /home2/cvsroot/ccvs/src/sanity.sh,v
retrieving revision 1.694
diff -c -r1.694 sanity.sh
*** sanity.sh   30 Apr 2001 19:07:09 -0000      1.694
--- sanity.sh   24 May 2001 17:08:23 -0000
***************
*** 677,682 ****
--- 677,683 ----
        tests="${tests} modules modules2 modules3 modules4 modules5"
        tests="${tests} mkmodules-temp-file-removal"
        tests="${tests} cvsadm emptydir abspath toplevel toplevel2"
+         tests="${tests} checkout_repository"
        # Log messages, error messages.
        tests="${tests} mflag editor errmsg1 errmsg2 adderrmsg"
        # Watches, binary files, history browsing, &c.
***************
*** 11651,11656 ****
--- 11652,11662 ----
          rm -r 1
          rm -rf ${CVSROOT_DIRNAME}/top-dir ${CVSROOT_DIRNAME}/second-dir
          ;;
+ 
+         checkout_repository)
+           dotest_fail check_repository "${testcvs} co -d /tmp/cvs-sanity/cvsroot 
+CVSROOT" \
+ "${PROG} \[checkout aborted\]: Cannot check out files into the repository itself"
+           ;;
  
        mflag)
          for message in '' ' ' '       

Reply via email to