To: [email protected]
Subject: Patch 6.3a.011
Fcc: outbox
From: Bram Moolenaar <[email protected]>
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------

Patch 6.3a.011
Problem:    Using the explorer plugin changes a local directory to the global
           directory.
Solution:   Don't use ":chdir" to restore the current directory.  Make
           "expand('%:p')" remove "/../" and "/./" items from the path.
Files:      runtime/plugin/explorer.vim, src/eval.c, src/os_unix.c


*** ../vim-6.3a.010/runtime/plugin/explorer.vim Fri May  7 10:59:32 2004
--- runtime/plugin/explorer.vim Wed May 12 11:30:24 2004
***************
*** 1,7 ****
 "=============================================================================
 " File: explorer.vim
 " Author: M A Aziz Ahmed ([email protected] - doesn't work)
! " Last Change:        2004 Mar 15
 " Version: 2.5 + changes
 " Additions by Mark Waggoner ([email protected]) et al.
 "-----------------------------------------------------------------------------
--- 1,7 ----
 "=============================================================================
 " File: explorer.vim
 " Author: M A Aziz Ahmed ([email protected] - doesn't work)
! " Last Change:        2004 May 12
 " Version: 2.5 + changes
 " Additions by Mark Waggoner ([email protected]) et al.
 "-----------------------------------------------------------------------------
***************
*** 283,299 ****
   endif

   " Get the complete path to the directory to look at with a slash at
!   " the end
   let b:completePath = s:Path(expand("%:p"))

-   " Save the directory we are currently in and chdir to the directory
-   " we are editing so that we can get a real path to the directory,
-   " eliminating things like ".."
-   let origdir= s:Path(getcwd())
-   exe "chdir" escape(b:completePath, s:escfilename)
-   let b:completePath = s:Path(getcwd())
-   exe "chdir" escape(origdir, s:escfilename)
-
   " Add a slash at the end
   if b:completePath !~ '/$'
     let b:completePath = b:completePath . '/'
--- 283,291 ----
   endif

   " Get the complete path to the directory to look at with a slash at
!   " the end.  This also removes "/../" and "/./" things.
   let b:completePath = s:Path(expand("%:p"))

   " Add a slash at the end
   if b:completePath !~ '/$'
     let b:completePath = b:completePath . '/'
***************
*** 518,529 ****
   endif

   " Is it a directory?  If so, get a real path to it instead of
!   " relative path
   if isdirectory(fn)
!     let origdir= s:Path(getcwd())
!     exe "chdir" escape(fn,s:escfilename)
!     let fn = s:Path(getcwd())
!     exe "chdir" escape(origdir,s:escfilename)
   endif

   " Open the new window
--- 510,518 ----
   endif

   " Is it a directory?  If so, get a real path to it instead of
!   " relative path.  This also removes "/../" and "/./" things.
   if isdirectory(fn)
!     let fn = fnamemodify(fn, ":p")
   endif

   " Open the new window
***************
*** 585,596 ****
   let s:longlist = w:longlist

   " Get the file name
!   let fn=s:GetFullFileName()
   if isdirectory(fn)
!     let origdir= s:Path(getcwd())
!     exe "chdir" escape(fn,s:escfilename)
!     let fn = s:Path(getcwd())
!     exe "chdir" escape(origdir,s:escfilename)
   endif

   " Move to desired window if needed
--- 574,583 ----
   let s:longlist = w:longlist

   " Get the file name
!   let fn = s:GetFullFileName()
   if isdirectory(fn)
!     " This removes "/../" and "/./" things.
!     let fn = fnamemodify(fn, ":p")
   endif

   " Move to desired window if needed
*** ../vim-6.3a.010/src/eval.c  Fri May  7 10:59:40 2004
--- src/eval.c  Tue May 11 18:05:00 2004
***************
*** 10276,10290 ****
           if (*fnamep == NULL)
               return -1;
       }
       /* FullName_save() is slow, don't use it when not needed. */
!       else if (!vim_isAbsName(*fnamep))
       {
!           *fnamep = FullName_save(*fnamep, FALSE);
           vim_free(*bufp);    /* free any allocated file name */
           *bufp = *fnamep;
           if (*fnamep == NULL)
               return -1;
       }
       /* Append a path separator to a directory. */
       if (mch_isdir(*fnamep))
       {
--- 10276,10304 ----
           if (*fnamep == NULL)
               return -1;
       }
+
+       /* When "/." or "/.." is used: force expansion to get rid of it. */
+       for (p = *fnamep; *p != NUL; ++p)
+       {
+           if (vim_ispathsep(*p)
+                   && p[1] == '.'
+                   && (p[2] == NUL
+                       || vim_ispathsep(p[2])
+                       || (p[2] == '.'
+                           && (p[3] == NUL || vim_ispathsep(p[3])))))
+               break;
+       }
+
       /* FullName_save() is slow, don't use it when not needed. */
!       if (*p != NUL || !vim_isAbsName(*fnamep))
       {
!           *fnamep = FullName_save(*fnamep, *p != NUL);
           vim_free(*bufp);    /* free any allocated file name */
           *bufp = *fnamep;
           if (*fnamep == NULL)
               return -1;
       }
+
       /* Append a path separator to a directory. */
       if (mch_isdir(*fnamep))
       {
*** ../vim-6.3a.010/src/os_unix.c       Fri May  7 10:59:38 2004
--- src/os_unix.c       Tue May 11 20:02:42 2004
***************
*** 2227,2233 ****
 #ifndef VMS
       else
       {
!           if (l > 0 && buf[l - 1] != '/' && *fname != NUL)
               STRCAT(buf, "/");
       }
 #endif
--- 2227,2234 ----
 #ifndef VMS
       else
       {
!           if (l > 0 && buf[l - 1] != '/' && *fname != NUL
!                                                  && STRCMP(fname, ".") != 0)
               STRCAT(buf, "/");
       }
 #endif
***************
*** 2236,2242 ****
     if (retval == FAIL || STRLEN(buf) + STRLEN(fname) >= len)
       return FAIL;

!     STRCAT(buf, fname);

     return OK;
 }
--- 2237,2245 ----
     if (retval == FAIL || STRLEN(buf) + STRLEN(fname) >= len)
       return FAIL;

!     /* Do not append ".", "/dir/." is equal to "/dir". */
!     if (STRCMP(fname, ".") != 0)
!       STRCAT(buf, fname);

     return OK;
 }
*** ../vim-6.3a.010/src/version.c       Tue May 11 22:32:13 2004
--- src/version.c       Wed May 12 14:10:47 2004
***************
*** 643,644 ****
--- 643,646 ----
 {   /* Add new patch number below this line */
+ /**/
+     11,
 /**/

--
hundred-and-one symptoms of being an internet addict:
262. Your computer has it's own phone line - but your daughter doesn't.

/// Bram Moolenaar -- [email protected] -- http://www.Moolenaar.net   \\\
///        Sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\              Project leader for A-A-P -- http://www.A-A-P.org        ///
\\\  Buy at Amazon and help AIDS victims -- http://ICCF.nl/click1.html ///