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 -~----------~----~----~----~------~----~------~--~---
