Jan Minar wrote:

> 1. Summary
> 
> Product  : Vim -- Vi IMproved, Netrw
> Version  : Tested with Vim 7.2b, Netrw 127
> Impact   : Arbitrary code execution
> Wherefrom: Local, possibly remote
> Original : http://www.rdancer.org/vulnerablevim-netrw.v5.html
>          http://www.rdancer.org/vulnerablevim-latest.tar.bz2
> 
> Lack of sanitization throughout Netrw can lead to arbitrary code
> execution upon opening a directory with a crafted name.
> 
> 
> 2. Overview
> 
> ``Netrw makes reading, writing, and browsing over a network connection
> easy!  [...] Netrw supports "transparent" editing of files on other
> machines using urls [...]''
> 
>       -- Netrw Reference Manual (pi_netrw.txt)
> 
> For the new Vim version, the Netrw plugin has been updated with the new
> fnameescape() and shellescape() functions.  However, not all of the
> vulnerable statements have been sanitized, and Netrw is still vulnerable
> to arbitrary code execution.
> 
> The latest version of the archive with code that we're using can be
> found at: ``http://www.rdancer.org/vulnerablevim-latest.tar.bz2''.
> 
> 
> Best results are achieved by running ``make test'' in the root directory
> of the abovementioned archive (this advisory details the ``netrw.v5''
> test case):
> 
>         -------------------------------------------
>         -------- Test results below ---------------
>         -------------------------------------------
>         Vim version 7.2b
>         zip.vim version: v21
>         netrw.vim version: v127
>         -------------------------------------------
>         filetype.vim
>           strong  : EXPLOIT FAILED
>           weak    : EXPLOIT FAILED
>         tarplugin : EXPLOIT FAILED
>         tarplugin.updated: EXPLOIT FAILED
>         zipplugin : EXPLOIT FAILED
>         zipplugin.v2: EXPLOIT FAILED
>         xpm.vim
>           xpm     : EXPLOIT FAILED
>           xpm2    : EXPLOIT FAILED
>           remote  : EXPLOIT FAILED
>         gzip_vim  : EXPLOIT FAILED
>         netrw     : EXPLOIT FAILED
>         netrw.v2  : EXPLOIT FAILED
>         netrw.v3  : VULNERABLE
>         netrw.v4  : EXPLOIT FAILED
>     --> netrw.v5  : VULNERABLE
> 
> 
> 3. Vulnerability
> 
> Few unsanitized statements still remain in ``netrw.vim'':
> 
>       $ grep -n exe ~/.vim/autoload/netrw.vim|grep -v -e escape -e Decho -e
> executable | wc -l
>       239
> 
> We will exploit the part of code where upon opening a directory, a
> string of keyboard mappings is loaded, using the ``execute'' command,
> with no sanitization of the ``b:netrw_curdir'' variable, which holds the
> current directory name.  In function s:BrowserMaps():
> 
>         1709    if s:didstarstar || !mapcheck("<s-up>","n")
>         1710     nnoremap <buffer> <silent> <s-up>   :Pexplore<cr>
>         1711    endif
>         1712    if g:netrw_mousemaps == 1
>         1713     nnoremap <buffer> <silent> <leftmouse>
> <leftmouse>:call <SID>NetrwLeftmouse(1)<cr>
>         1714     nnoremap <buffer> <silent> <middlemouse>
> <leftmouse>:call <SID>NetrwPrevWinOpen(1)<cr>
>         1715     nnoremap <buffer> <silent> <s-leftmouse>
> <leftmouse>:call <SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
>    -->  1716     exe 'nnoremap <buffer> <silent> <rightmouse>
> <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
>    -->  1717     exe 'vnoremap <buffer> <silent> <rightmouse>
> <leftmouse>:call <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
>         1718    endif
>    -->  1719    exe 'nnoremap <buffer> <silent> <del>        :call
> <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
>    -->  1720    exe 'vnoremap <buffer> <silent> <del>        :call
> <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
>    -->  1721    exe 'nnoremap <buffer> <silent> D            :call
> <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
>    -->  1722    exe 'vnoremap <buffer> <silent> D            :call
> <SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
>    -->  1723    exe 'nnoremap <buffer> <silent> R            :call
> <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
>    -->  1724    exe 'vnoremap <buffer> <silent> R            :call
> <SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
>    -->  1725    exe 'nnoremap <buffer> <silent> <Leader>m    :call
> <SID>NetrwMakeDir("")<cr>'
>         1726    nnoremap <buffer> <F1>               :he netrw-quickhelp<cr>

Unfortunately Charles in not reachable right now.  So I had a go at
fixing this.  I also found other problems while performing tests and
fixed those.

I will upload the fixed plugin to the ftp site.  Below is the patch
relative to the version included with Vim 7.2b.

Let me know if my changes introduce any problems, or if you spot
something that is still wrong.


*** ../vim-7.2b.004/runtime/autoload/netrw.vim  Sun Jul 13 19:14:22 2008
--- runtime/autoload/netrw.vim  Wed Jul 16 22:17:26 2008
***************
*** 1,7 ****
  " netrw.vim: Handles file transfer and remote directory listing across
  "            AUTOLOAD SECTION
! " Date:               Jul 12, 2008
! " Version:    127
  " Maintainer: Charles E Campbell, Jr <[EMAIL PROTECTED]>
  " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
  " Copyright:    Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1
--- 1,7 ----
  " netrw.vim: Handles file transfer and remote directory listing across
  "            AUTOLOAD SECTION
! " Date:               Jul 16, 2008
! " Version:    127 + changes by Bram
  " Maintainer: Charles E Campbell, Jr <[EMAIL PROTECTED]>
  " GetLatestVimScripts: 1075 1 :AutoInstall: netrw.vim
  " Copyright:    Copyright (C) 1999-2008 Charles E. Campbell, Jr. {{{1
***************
*** 27,33 ****
   let s:WARNING = 1
   let s:ERROR   = 2
  endif
! let g:loaded_netrw = "v127"
  
  " sanity checks
  if v:version < 700
--- 27,33 ----
   let s:WARNING = 1
   let s:ERROR   = 2
  endif
! let g:loaded_netrw = "v127+b"
  
  " sanity checks
  if v:version < 700
***************
*** 359,364 ****
--- 359,365 ----
  if !exists("g:netrw_tmpfile_escape")
   let g:netrw_tmpfile_escape= ' &;'
  endif
+ let s:netrw_map_escape = "<|\n\r\\\<C-V>\""
  
  " BufEnter event ignored by decho when following variable is true
  "  Has a side effect that doau BufReadPost doesn't work, so
***************
*** 713,725 ****
       let netrw_fname= b:netrw_fname
       call s:SaveBufVars()|new|call s:RestoreBufVars()
       setlocal ff=unix
!      exe "put ='".g:netrw_ftpmode."'"
  "     call Decho("filter input: ".getline('.'))
       if exists("g:netrw_ftpextracmd")
!       exe "put ='".g:netrw_ftpextracmd."'"
  "      call Decho("filter input: ".getline('.'))
       endif
!      exe "put ='".'get \"'.netrw_fname.'\" '.tmpfile."'"
  "     call Decho("filter input: ".getline('.'))
       if exists("g:netrw_port") && g:netrw_port != ""
  "      call Decho("executing: %!".g:netrw_ftp_cmd." -i 
".shellescape(g:netrw_machine." ".g:netrw_port,1))
--- 714,726 ----
       let netrw_fname= b:netrw_fname
       call s:SaveBufVars()|new|call s:RestoreBufVars()
       setlocal ff=unix
!      put =g:netrw_ftpmode
  "     call Decho("filter input: ".getline('.'))
       if exists("g:netrw_ftpextracmd")
!       put =g:netrw_ftpextracmd
  "      call Decho("filter input: ".getline('.'))
       endif
!      put ='get \"'.netrw_fname.'\" '.tmpfile
  "     call Decho("filter input: ".getline('.'))
       if exists("g:netrw_port") && g:netrw_port != ""
  "      call Decho("executing: %!".g:netrw_ftp_cmd." -i 
".shellescape(g:netrw_machine." ".g:netrw_port,1))
***************
*** 770,776 ****
  "     call Decho("filter input: ".getline('.'))
      endif
      if exists("g:netrw_ftpextracmd")
!      exe "put ='".g:netrw_ftpextracmd."'"
  "     call Decho("filter input: ".getline('.'))
      endif
      put ='get \"'.netrw_fname.'\" '.tmpfile
--- 771,777 ----
  "     call Decho("filter input: ".getline('.'))
      endif
      if exists("g:netrw_ftpextracmd")
!      put =g:netrw_ftpextracmd
  "     call Decho("filter input: ".getline('.'))
      endif
      put ='get \"'.netrw_fname.'\" '.tmpfile
***************
*** 1084,1096 ****
      new
  "    call Decho("filter input window#".winnr())
      setlocal ff=unix
!     exe "put ='".g:netrw_ftpmode."'"
  "    call Decho("filter input: ".getline('.'))
      if exists("g:netrw_ftpextracmd")
!      exe "put ='".g:netrw_ftpextracmd."'"
  "     call Decho("filter input: ".getline('.'))
      endif
!     exe "put ='".'put \"'.tmpfile.'\" \"'.netrw_fname.'\"'."'"
  "    call Decho("filter input: ".getline('.'))
      if exists("g:netrw_port") && g:netrw_port != ""
  "     call Decho("executing: %!".g:netrw_ftp_cmd." -i 
".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
--- 1085,1097 ----
      new
  "    call Decho("filter input window#".winnr())
      setlocal ff=unix
!     put =g:netrw_ftpmode
  "    call Decho("filter input: ".getline('.'))
      if exists("g:netrw_ftpextracmd")
!      put =g:netrw_ftpextracmd
  "     call Decho("filter input: ".getline('.'))
      endif
!     put ='put \"'.tmpfile.'\" \"'.netrw_fname.'\"'
  "    call Decho("filter input: ".getline('.'))
      if exists("g:netrw_port") && g:netrw_port != ""
  "     call Decho("executing: %!".g:netrw_ftp_cmd." -i 
".shellescape(g:netrw_machine,1)." ".shellescape(g:netrw_port,1))
***************
*** 1278,1285 ****
      call netrw#NetRead(3,a:{i})
  "    call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">")
      if s:FileReadable(s:netrw_tmpfile)
! "     call Decho("exe so ".s:netrw_tmpfile)
!      exe "so ".s:netrw_tmpfile
       call delete(s:netrw_tmpfile)
       unlet s:netrw_tmpfile
      else
--- 1279,1286 ----
      call netrw#NetRead(3,a:{i})
  "    call Decho("s:netread_tmpfile<".s:netrw_tmpfile.">")
      if s:FileReadable(s:netrw_tmpfile)
! "     call Decho("exe so ".fnameescape(s:netrw_tmpfile))
!      exe "so ".fnameescape(s:netrw_tmpfile)
       call delete(s:netrw_tmpfile)
       unlet s:netrw_tmpfile
      else
***************
*** 1713,1727 ****
      nnoremap <buffer> <silent> <leftmouse>   <leftmouse>:call 
<SID>NetrwLeftmouse(1)<cr>
      nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call 
<SID>NetrwPrevWinOpen(1)<cr>
      nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call 
<SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
!     exe 'nnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call 
<SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
!     exe 'vnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call 
<SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
!    endif
!    exe 'nnoremap <buffer> <silent> <del>      :call 
<SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
!    exe 'vnoremap <buffer> <silent> <del>      :call 
<SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
!    exe 'nnoremap <buffer> <silent> D          :call 
<SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
!    exe 'vnoremap <buffer> <silent> D          :call 
<SID>NetrwLocalRm("'.b:netrw_curdir.'")<cr>'
!    exe 'nnoremap <buffer> <silent> R          :call 
<SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
!    exe 'vnoremap <buffer> <silent> R          :call 
<SID>NetrwLocalRename("'.b:netrw_curdir.'")<cr>'
     exe 'nnoremap <buffer> <silent> <Leader>m  :call <SID>NetrwMakeDir("")<cr>'
     nnoremap <buffer> <F1>             :he netrw-quickhelp<cr>
  
--- 1714,1729 ----
      nnoremap <buffer> <silent> <leftmouse>   <leftmouse>:call 
<SID>NetrwLeftmouse(1)<cr>
      nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call 
<SID>NetrwPrevWinOpen(1)<cr>
      nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call 
<SID>NetrwMarkFile(1,<SID>NetrwGetWord())<cr>
!     let curdir = escape(b:netrw_curdir, s:netrw_map_escape)
!     exe 'nnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call 
<SID>NetrwLocalRm("'.curdir.'")<cr>'
!     exe 'vnoremap <buffer> <silent> <rightmouse>  <leftmouse>:call 
<SID>NetrwLocalRm("'.curdir.'")<cr>'
!    endif
!    exe 'nnoremap <buffer> <silent> <del>      :call 
<SID>NetrwLocalRm("'.curdir.'")<cr>'
!    exe 'vnoremap <buffer> <silent> <del>      :call 
<SID>NetrwLocalRm("'.curdir.'")<cr>'
!    exe 'nnoremap <buffer> <silent> D          :call 
<SID>NetrwLocalRm("'.curdir.'")<cr>'
!    exe 'vnoremap <buffer> <silent> D          :call 
<SID>NetrwLocalRm("'.curdir.'")<cr>'
!    exe 'nnoremap <buffer> <silent> R          :call 
<SID>NetrwLocalRename("'.curdir.'")<cr>'
!    exe 'vnoremap <buffer> <silent> R          :call 
<SID>NetrwLocalRename("'.curdir.'")<cr>'
     exe 'nnoremap <buffer> <silent> <Leader>m  :call <SID>NetrwMakeDir("")<cr>'
     nnoremap <buffer> <F1>             :he netrw-quickhelp<cr>
  
***************
*** 1779,1794 ****
      nnoremap <buffer> <silent> <leftmouse>   <leftmouse>:call 
<SID>NetrwLeftmouse(0)<cr>
      nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call 
<SID>NetrwPrevWinOpen(0)<cr>
      nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call 
<SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
!     exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
!     exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
     endif
!    exe 'nnoremap <buffer> <silent> <del>      :call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
!    exe 'vnoremap <buffer> <silent> <del>      :call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
     exe 'nnoremap <buffer> <silent> d  :call 
<SID>NetrwMakeDir("'.s:user.s:machine.'")<cr>'
!    exe 'nnoremap <buffer> <silent> D  :call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
!    exe 'vnoremap <buffer> <silent> D  :call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.s:path.'")<cr>'
!    exe 'nnoremap <buffer> <silent> R  :call 
<SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
!    exe 'vnoremap <buffer> <silent> R  :call 
<SID>NetrwRemoteRename("'.s:user.s:machine.'","'.s:path.'")<cr>'
     nnoremap <buffer> <F1>                     :he netrw-quickhelp<cr>
    endif
    call s:SetRexDir(a:islocal,b:netrw_curdir)
--- 1781,1797 ----
      nnoremap <buffer> <silent> <leftmouse>   <leftmouse>:call 
<SID>NetrwLeftmouse(0)<cr>
      nnoremap <buffer> <silent> <middlemouse> <leftmouse>:call 
<SID>NetrwPrevWinOpen(0)<cr>
      nnoremap <buffer> <silent> <s-leftmouse> <leftmouse>:call 
<SID>NetrwMarkFile(0,<SID>NetrwGetWord())<cr>
!     let path = escape(s:path, s:netrw_map_escape)
!     exe 'nnoremap <buffer> <silent> <rightmouse> <leftmouse>:call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.path.'")<cr>'
!     exe 'vnoremap <buffer> <silent> <rightmouse> <leftmouse>:call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.path.'")<cr>'
     endif
!    exe 'nnoremap <buffer> <silent> <del>      :call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.path.'")<cr>'
!    exe 'vnoremap <buffer> <silent> <del>      :call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.path.'")<cr>'
     exe 'nnoremap <buffer> <silent> d  :call 
<SID>NetrwMakeDir("'.s:user.s:machine.'")<cr>'
!    exe 'nnoremap <buffer> <silent> D  :call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.path.'")<cr>'
!    exe 'vnoremap <buffer> <silent> D  :call 
<SID>NetrwRemoteRm("'.s:user.s:machine.'","'.path.'")<cr>'
!    exe 'nnoremap <buffer> <silent> R  :call 
<SID>NetrwRemoteRename("'.s:user.s:machine.'","'.path.'")<cr>'
!    exe 'vnoremap <buffer> <silent> R  :call 
<SID>NetrwRemoteRename("'.s:user.s:machine.'","'.path.'")<cr>'
     nnoremap <buffer> <F1>                     :he netrw-quickhelp<cr>
    endif
    call s:SetRexDir(a:islocal,b:netrw_curdir)
***************
*** 3273,3279 ****
       if starpat == 1
        " starpat=1: Explore *//pattern  (current directory only search for 
files containing pattern)
  "      call Decho("starpat=".starpat.": build *//pattern list")
!       exe "vimgrep /".pattern."/gj ".b:netrw_curdir."/*"
        let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
        if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
  
--- 3276,3282 ----
       if starpat == 1
        " starpat=1: Explore *//pattern  (current directory only search for 
files containing pattern)
  "      call Decho("starpat=".starpat.": build *//pattern list")
!       exe "vimgrep /".pattern."/gj ".fnameescape(b:netrw_curdir)."/*"
        let w:netrw_explore_list = map(getqflist(),'bufname(v:val.bufnr)')
        if &hls | let keepregslash= s:ExplorePatHls(pattern) | endif
  
***************
*** 3968,3980 ****
      endif
      if cnt == 1
  "     call Decho("diffthis: ".fname)
!      exe "e ".fname
       diffthis
      elseif cnt == 2 || cnt == 3
       vsplit
       wincmd l
  "     call Decho("diffthis: ".fname)
!      exe "e ".fname
       diffthis
      else
       break
--- 3971,3983 ----
      endif
      if cnt == 1
  "     call Decho("diffthis: ".fname)
!      exe "e ".fnameescape(fname)
       diffthis
      elseif cnt == 2 || cnt == 3
       vsplit
       wincmd l
  "     call Decho("diffthis: ".fname)
!      exe "e ".fnameescape(fname)
       diffthis
      else
       break
***************
*** 4295,4301 ****
      1split
      " the autocmds will handle both local and remote files
  "    call Decho("exe silent e ".escape(fname,' '))
!     exe "silent e ".escape(fname,' ')
  "    call Decho("hardcopy")
      hardcopy
      q
--- 4298,4304 ----
      1split
      " the autocmds will handle both local and remote files
  "    call Decho("exe silent e ".escape(fname,' '))
!     exe "silent e ".fnameescape(fname)
  "    call Decho("hardcopy")
      hardcopy
      q
***************
*** 4812,4818 ****
       let tmpbufnr= bufnr("%")
       setlocal ff=unix
       if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
!       exe "put ='".g:netrw_ftpmode."'"
  "      call Decho("filter input: ".getline('$'))
       endif
  
--- 4815,4821 ----
       let tmpbufnr= bufnr("%")
       setlocal ff=unix
       if exists("g:netrw_ftpmode") && g:netrw_ftpmode != ""
!       put =g:netrw_ftpmode
  "      call Decho("filter input: ".getline('$'))
       endif
  
***************
*** 4822,4828 ****
       endif
  
       if exists("g:netrw_ftpextracmd")
!       exe "put ='".g:netrw_ftpextracmd."'"
  "      call Decho("filter input: ".getline('$'))
       endif
       for fname in fnamelist
--- 4825,4831 ----
       endif
  
       if exists("g:netrw_ftpextracmd")
!       put =g:netrw_ftpextracmd
  "      call Decho("filter input: ".getline('$'))
       endif
       for fname in fnamelist
***************
*** 4880,4891 ****
      endif
  
      if exists("g:netrw_ftpextracmd")
!      exe "put ='".g:netrw_ftpextracmd."'"
  "     call Decho("filter input: ".getline('$'))
      endif
  
      if exists("g:netrw_ftpextracmd")
!      exe "put ='".g:netrw_ftpextracmd."'"
  "     call Decho("filter input: ".getline('$'))
      endif
      for fname in fnamelist
--- 4883,4894 ----
      endif
  
      if exists("g:netrw_ftpextracmd")
!      put =g:netrw_ftpextracmd
  "     call Decho("filter input: ".getline('$'))
      endif
  
      if exists("g:netrw_ftpextracmd")
!      put =g:netrw_ftpextracmd
  "     call Decho("filter input: ".getline('$'))
      endif
      for fname in fnamelist
***************
*** 5053,5067 ****
     " handle uploading a single file using NetWrite
  "   call Decho("handle uploading a single file via NetWrite")
     1split
!    let efname= escape(a:fname,g:netrw_fname_escape)
! "   call Decho("exe e ".efname)
!    exe "e ".efname
  "   call Decho("now locally editing<".expand("%").">, has ".line("$")." 
lines")
     if a:tgt =~ '/$'
      let wfname= substitute(a:fname,'^.*/','','')
-     let wfname= escape(a:tgt.wfname,g:netrw_fname_escape)
  "    call Decho("exe w! ".fnameescape(wfname))
!     exe "w! ".fnameescape(wfname)
     else
  "    call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
      exe "w ".fnameescape(a:tgt)
--- 5056,5068 ----
     " handle uploading a single file using NetWrite
  "   call Decho("handle uploading a single file via NetWrite")
     1split
! "   call Decho("exe e ".fnameescape(a:fname))
!    exe "e ".fnameescape(a:fname)
  "   call Decho("now locally editing<".expand("%").">, has ".line("$")." 
lines")
     if a:tgt =~ '/$'
      let wfname= substitute(a:fname,'^.*/','','')
  "    call Decho("exe w! ".fnameescape(wfname))
!     exe "w! ".fnameescape(a:tgt.wfname)
     else
  "    call Decho("writing local->remote: exe w ".fnameescape(a:tgt))
      exe "w ".fnameescape(a:tgt)
***************
*** 5097,5107 ****
       silent keepjumps new
  "     call Decho("filter input window#".winnr())
  
!      exe "put ='".g:netrw_ftpmode."'"
  "     call Decho("filter input: ".getline('$'))
  
       if exists("g:netrw_ftpextracmd")
!       exe "put ='".g:netrw_ftpextracmd."'"
  "      call Decho("filter input: ".getline('$'))
       endif
  
--- 5098,5108 ----
       silent keepjumps new
  "     call Decho("filter input window#".winnr())
  
!      put =g:netrw_ftpmode
  "     call Decho("filter input: ".getline('$'))
  
       if exists("g:netrw_ftpextracmd")
!       put =g:netrw_ftpextracmd
  "      call Decho("filter input: ".getline('$'))
       endif
  
***************
*** 5166,5172 ****
       endif
  
       if exists("g:netrw_ftpextracmd")
!       exe "put ='".g:netrw_ftpextracmd."'"
  "      call Decho("filter input: ".getline('$'))
       endif
  
--- 5167,5173 ----
       endif
  
       if exists("g:netrw_ftpextracmd")
!       put =g:netrw_ftpextracmd
  "      call Decho("filter input: ".getline('$'))
       endif
  
***************
*** 5210,5216 ****
    call s:NetrwSafeOptions()
    if has("quickfix")
     if !isdirectory(a:path)
!     exe (g:netrw_preview? "vert " : "")."pedit 
".escape(a:path,g:netrw_fname_escape)
     elseif !exists("g:netrw_quiet")
      call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as 
<".a:path.">",38)
     endif
--- 5211,5217 ----
    call s:NetrwSafeOptions()
    if has("quickfix")
     if !isdirectory(a:path)
!     exe (g:netrw_preview? "vert " : "")."pedit ".fnameescape(a:path)
     elseif !exists("g:netrw_quiet")
      call netrw#ErrorMsg(s:WARNING,"sorry, cannot preview a directory such as 
<".a:path.">",38)
     endif
***************
*** 6027,6034 ****
     let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
  "   call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
     if g:netrw_scp_cmd =~ '^pscp'
! "    call Decho("1: exe silent r! ".listcmd.s:path)
!     exe "silent r! ".listcmd.s:path
      " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
      g/^Listing directory/d
      g/^d[-rwx][-rwx][-rwx]/s+$+/+e
--- 6028,6035 ----
     let listcmd= s:MakeSshCmd(g:netrw_list_cmd)
  "   call Decho("listcmd<".listcmd."> (using g:netrw_list_cmd)")
     if g:netrw_scp_cmd =~ '^pscp'
! "    call Decho("1: exe silent r! ".shellescape(listcmd.s:path, 1))
!     exe "silent r! ".listcmd.shellescape(s:path, 1)
      " remove rubbish and adjust listing format of 'pscp' to 'ssh ls -FLa' like
      g/^Listing directory/d
      g/^d[-rwx][-rwx][-rwx]/s+$+/+e
***************
*** 6286,6292 ****
      put ='cd \"'.a:path.'\"'
     endif
     if exists("g:netrw_ftpextracmd")
!     exe "put ='".g:netrw_ftpextracmd."'"
  "    call Decho("filter input: ".getline('.'))
     endif
     call setline(line("$")+1,a:listcmd)
--- 6287,6293 ----
      put ='cd \"'.a:path.'\"'
     endif
     if exists("g:netrw_ftpextracmd")
!     put =g:netrw_ftpextracmd
  "    call Decho("filter input: ".getline('.'))
     endif
     call setline(line("$")+1,a:listcmd)
***************
*** 6320,6326 ****
      put ='cd \"'.a:path.'\"'
     endif
     if exists("g:netrw_ftpextracmd")
!     exe "put ='".g:netrw_ftpextracmd."'"
  "    call Decho("filter input: ".getline('.'))
     endif
     call setline(line("$")+1,a:listcmd)
--- 6321,6327 ----
      put ='cd \"'.a:path.'\"'
     endif
     if exists("g:netrw_ftpextracmd")
!     put =g:netrw_ftpextracmd
  "    call Decho("filter input: ".getline('.'))
     endif
     call setline(line("$")+1,a:listcmd)
***************
*** 7570,7591 ****
  "  call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
    " set up Rex and leftmouse-double-click
    if a:islocal
!    exe 'com! Rexplore call s:NetrwRexplore(1,"'.a:dirname.'")'
     if g:netrw_retmap
      silent! unmap <2-leftmouse>
      if !hasmapto("<Plug>NetrwReturn")
       nmap <unique> <silent> <2-leftmouse>     <Plug>NetrwReturn
      endif
!     exe 'nnoremap <silent> <Plug>NetrwReturn :call 
<SID>NetrwRexplore(1,"'.a:dirname.'")<cr>'
     endif
    else
!    exe 'com! Rexplore call s:NetrwRexplore(0,"'.a:dirname.'")'
     if g:netrw_retmap
      silent! unmap <2-leftmouse>
      if !hasmapto("<Plug>NetrwReturn")
       nmap <unique> <silent> <2-leftmouse>     <Plug>NetrwReturn
      endif
!     exe 'nnoremap <silent> <Plug>NetrwReturn :call 
<SID>NetrwRexplore(0,"'.a:dirname.'")<cr>'
     endif
    endif
  "  call Dret("s:SetRexDir")
--- 7571,7594 ----
  "  call Dfunc("s:SetRexDir(islocal=".a:islocal." dirname<".a:dirname.">)")
    " set up Rex and leftmouse-double-click
    if a:islocal
!    exe 'com! Rexplore call s:NetrwRexplore(1,"'.escape(a:dirname,'"\').'")'
     if g:netrw_retmap
      silent! unmap <2-leftmouse>
      if !hasmapto("<Plug>NetrwReturn")
       nmap <unique> <silent> <2-leftmouse>     <Plug>NetrwReturn
      endif
!     let dir = escape(a:dirname, s:netrw_map_escape)
!     exe 'nnoremap <silent> <Plug>NetrwReturn :call 
<SID>NetrwRexplore(1,"'.dir.'")<cr>'
     endif
    else
!    exe 'com! Rexplore call s:NetrwRexplore(0,"'.escape(a:dirname,'"\').'")'
     if g:netrw_retmap
      silent! unmap <2-leftmouse>
      if !hasmapto("<Plug>NetrwReturn")
       nmap <unique> <silent> <2-leftmouse>     <Plug>NetrwReturn
      endif
!     let dir = escape(a:dirname, s:netrw_map_escape)
!     exe 'nnoremap <silent> <Plug>NetrwReturn :call 
<SID>NetrwRexplore(0,"'.dir.'")<cr>'
     endif
    endif
  "  call Dret("s:SetRexDir")
*** ../vim-7.2b.004/runtime/plugin/netrwPlugin.vim      Sun Jul 13 19:14:49 2008
--- runtime/plugin/netrwPlugin.vim      Wed Jul 16 21:38:38 2008
***************
*** 47,61 ****
  augroup Network
   au!
   if has("win32") || has("win95") || has("win64") || has("win16")
!   au BufReadCmd  file://*             exe "silent doau BufReadPre 
".netrw#RFC2396(expand("<amatch>"))|exe 'e 
'.substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',"")|exe 
"bwipe ".expand("<amatch>")|exe "silent doau BufReadPost 
".netrw#RFC2396(expand("<amatch>"))
   else
!   au BufReadCmd  file://*             exe "silent doau BufReadPre 
".netrw#RFC2396(expand("<amatch>"))|exe 'e 
'.substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',"")|exe 
"bwipe ".expand("<amatch>")|exe "silent doau BufReadPost 
".netrw#RFC2396(expand("<amatch>"))
!   au BufReadCmd  file://localhost/*   exe "silent doau BufReadPre 
".netrw#RFC2396(expand("<amatch>"))|exe 'e 
'.substitute(netrw#RFC2396(expand("<amatch>")),'file://localhost/\(.*\)','\1',"")|exe
 "bwipe ".substitute(expand("<amatch>"),'file://\([EMAIL 
PROTECTED])\=','','')|exe "silent doau BufReadPost 
".netrw#RFC2396(expand("<amatch>"))
   endif
!  au BufReadCmd   
ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe 
"silent doau BufReadPre ".expand("<amatch>")|exe '2Nread 
"'.expand("<amatch>").'"'|exe "silent doau BufReadPost ".expand("<amatch>")
!  au FileReadCmd  
ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe 
"silent doau FileReadPre ".expand("<amatch>")|exe 'Nread "'   
.expand("<amatch>").'"'|exe "silent doau FileReadPost ".expand("<amatch>")
!  au BufWriteCmd  ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://*  
        exe "silent doau BufWritePre ".expand("<amatch>")|exe 'Nwrite "' 
.expand("<amatch>").'"'|exe "silent doau BufWritePost ".expand("<amatch>")
!  au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://*  
        exe "silent doau FileWritePre ".expand("<amatch>")|exe "'[,']".'Nwrite 
"' .expand("<amatch>").'"'|exe "silent doau FileWritePost ".expand("<amatch>")
   try
    au SourceCmd    
ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://*        exe 
'Nsource "'.expand("<amatch>").'"'
   catch /^Vim\%((\a\+)\)\=:E216/
--- 47,61 ----
  augroup Network
   au!
   if has("win32") || has("win95") || has("win64") || has("win16")
!   au BufReadCmd  file://*             exe "silent doau BufReadPre 
".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e 
'.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',""))|exe
 "bwipe ".fnameescape(expand("<amatch>"))|exe "silent doau BufReadPost 
".fnameescape(netrw#RFC2396(expand("<amatch>")))
   else
!   au BufReadCmd  file://*             exe "silent doau BufReadPre 
".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e 
'.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://\(.*\)','\1',""))|exe
 "bwipe ".fnameescape(expand("<amatch>"))|exe "silent doau BufReadPost 
".fnameescape(netrw#RFC2396(expand("<amatch>")))
!   au BufReadCmd  file://localhost/*   exe "silent doau BufReadPre 
".fnameescape(netrw#RFC2396(expand("<amatch>")))|exe 'e 
'.fnameescape(substitute(netrw#RFC2396(expand("<amatch>")),'file://localhost/\(.*\)','\1',""))|exe
 "bwipe ".fnameescape(substitute(expand("<amatch>"),'file://\([EMAIL 
PROTECTED])\=','',''))|exe "silent doau BufReadPost 
".fnameescape(netrw#RFC2396(expand("<amatch>")))
   endif
!  au BufReadCmd   
ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe 
"silent doau BufReadPre ".fnameescape(expand("<amatch>"))|exe '2Nread 
"'.expand("<amatch>").'"'|exe "silent doau BufReadPost 
".fnameescape(expand("<amatch>"))
!  au FileReadCmd  
ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://* exe 
"silent doau FileReadPre ".expand("<amatch>")|exe 'Nread "'   
.expand("<amatch>").'"'|exe "silent doau FileReadPost 
".fnameescape(expand("<amatch>"))
!  au BufWriteCmd  ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://*  
        exe "silent doau BufWritePre ".fnameescape(expand("<amatch>"))|exe 
'Nwrite "' .expand("<amatch>").'"'|exe "silent doau BufWritePost 
".fnameescape(expand("<amatch>"))
!  au FileWriteCmd ftp://*,rcp://*,scp://*,dav://*,davs://*,rsync://*,sftp://*  
        exe "silent doau FileWritePre ".fnameescape(expand("<amatch>"))|exe 
"'[,']".'Nwrite "' .expand("<amatch>").'"'|exe "silent doau FileWritePost 
".fnameescape(expand("<amatch>"))
   try
    au SourceCmd    
ftp://*,rcp://*,scp://*,http://*,dav://*,davs://*,rsync://*,sftp://*        exe 
'Nsource "'.expand("<amatch>").'"'
   catch /^Vim\%((\a\+)\)\=:E216/


-- 
Did you hear about the new 3 million dollar West Virginia State Lottery?
The winner gets 3 dollars a year for a million years.

 /// Bram Moolenaar -- [EMAIL PROTECTED] -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\        download, build and distribute -- http://www.A-A-P.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///

--~--~---------~--~----~------------~-------~--~----~
You received this message from the "vim_dev" maillist.
For more information, visit http://www.vim.org/maillist.php
-~----------~----~----~----~------~----~------~--~---

Raspunde prin e-mail lui