]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
updated for version 7.4.565 v7.4.565
authorBram Moolenaar <Bram@vim.org>
Wed, 7 Jan 2015 14:57:17 +0000 (15:57 +0100)
committerBram Moolenaar <Bram@vim.org>
Wed, 7 Jan 2015 14:57:17 +0000 (15:57 +0100)
Problem:    Ranges for arguments, buffers, tabs, etc. are not checked to be
            valid but limited to the maximum.  This can cause the wrong thing
            to happen.
Solution:   Give an error for an invalid value. (Marcin Szamotulski)
            Use windows range for ":wincmd".

src/ex_cmds.h
src/ex_docmd.c
src/testdir/test62.in
src/testdir/test_argument_count.in
src/testdir/test_argument_count.ok
src/testdir/test_close_count.in
src/testdir/test_command_count.in
src/testdir/test_command_count.ok
src/version.c

index 95a22898be3c4431c75564c188c007d78d9aad39..6396d60c25a6a6b287f0e231b44a9d7906ff6eec 100644 (file)
@@ -1574,7 +1574,7 @@ EX(CMD_winsize,           "winsize",      ex_winsize,
                        ADDR_LINES),
 EX(CMD_wincmd,         "wincmd",       ex_wincmd,
                        NEEDARG|WORD1|RANGE|NOTADR,
-                       ADDR_LINES),
+                       ADDR_WINDOWS),
 EX(CMD_windo,          "windo",        ex_listdo,
                        BANG|NEEDARG|EXTRA|NOTRLCOM,
                        ADDR_LINES),
index b37c6ed8cc94819cad418b467532fc39cc102833..3276abfdbc48daabb53540de06eefa5d9a73439a 100644 (file)
@@ -2161,6 +2161,8 @@ do_one_cmd(cmdlinep, sourcing,
                break;
            case ADDR_ARGUMENTS:
                ea.line2 = curwin->w_arg_idx + 1;
+               if (ea.line2 > ARGCOUNT)
+                   ea.line2 = ARGCOUNT;
                break;
            case ADDR_LOADED_BUFFERS:
            case ADDR_BUFFERS:
@@ -3110,7 +3112,7 @@ find_command(eap, full)
      * Exceptions:
      * - the 'k' command can directly be followed by any character.
      * - the 's' command can be followed directly by 'c', 'g', 'i', 'I' or 'r'
-     *     but :sre[wind] is another command, as are :scrip[tnames],
+     *     but :sre[wind] is another command, as are :scr[iptnames],
      *     :scs[cope], :sim[alt], :sig[ns] and :sil[ent].
      * - the "d" command can directly be followed by 'l' or 'p' flag.
      */
@@ -4573,46 +4575,6 @@ get_address(ptr, addr_type, skip, to_other_file)
                lnum -= n;
            else
                lnum += n;
-
-           switch (addr_type)
-           {
-               case ADDR_LINES:
-                   break;
-               case ADDR_ARGUMENTS:
-                   if (lnum < 0)
-                       lnum = 0;
-                   else if (lnum >= ARGCOUNT)
-                       lnum = ARGCOUNT;
-                   break;
-               case ADDR_TABS:
-                   if (lnum < 0)
-                   {
-                       lnum = 0;
-                       break;
-                   }
-                   if (lnum >= LAST_TAB_NR)
-                       lnum = LAST_TAB_NR;
-                   break;
-               case ADDR_WINDOWS:
-                   if (lnum < 0)
-                   {
-                       lnum = 0;
-                       break;
-                   }
-                   if (lnum >= LAST_WIN_NR)
-                       lnum = LAST_WIN_NR;
-                   break;
-               case ADDR_LOADED_BUFFERS:
-               case ADDR_BUFFERS:
-                   if (lnum < firstbuf->b_fnum)
-                   {
-                       lnum = firstbuf->b_fnum;
-                       break;
-                   }
-                   if (lnum > lastbuf->b_fnum)
-                       lnum = lastbuf->b_fnum;
-                   break;
-           }
        }
     } while (*cmd == '/' || *cmd == '?');
 
@@ -4675,17 +4637,65 @@ ex_script_ni(eap)
 invalid_range(eap)
     exarg_T    *eap;
 {
+    buf_T      *buf;
     if (       eap->line1 < 0
            || eap->line2 < 0
-           || eap->line1 > eap->line2
-           || ((eap->argt & RANGE)
-               && !(eap->argt & NOTADR)
-               && eap->line2 > curbuf->b_ml.ml_line_count
+           || eap->line1 > eap->line2)
+       return (char_u *)_(e_invrange);
+
+    if (eap->argt & RANGE)
+    {
+       switch(eap->addr_type)
+       {
+           case ADDR_LINES:
+               if (!(eap->argt & NOTADR)
+                       && eap->line2 > curbuf->b_ml.ml_line_count
 #ifdef FEAT_DIFF
-                       + (eap->cmdidx == CMD_diffget)
+                           + (eap->cmdidx == CMD_diffget)
 #endif
-               ))
-       return (char_u *)_(e_invrange);
+                  )
+                   return (char_u *)_(e_invrange);
+               break;
+           case ADDR_ARGUMENTS:
+               if (eap->line2 > ARGCOUNT + (!ARGCOUNT))    // add 1 if ARCOUNT is 0
+                   return (char_u *)_(e_invrange);
+               break;
+           case ADDR_BUFFERS:
+               if (eap->line1 < firstbuf->b_fnum
+                       || eap->line2 > lastbuf->b_fnum)
+                   return (char_u *)_(e_invrange);
+               break;
+           case ADDR_LOADED_BUFFERS:
+               buf = firstbuf;
+               while (buf->b_ml.ml_mfp == NULL)
+               {
+                   if (buf->b_next == NULL)
+                       return (char_u *)_(e_invrange);
+                   buf = buf->b_next;
+               }
+               if (eap->line1 < buf->b_fnum)
+                   return (char_u *)_(e_invrange);
+               buf = lastbuf;
+               while (buf->b_ml.ml_mfp == NULL)
+               {
+                   if (buf->b_prev == NULL)
+                       return (char_u *)_(e_invrange);
+                   buf = buf->b_prev;
+               }
+               if (eap->line2 > buf->b_fnum)
+                   return (char_u *)_(e_invrange);
+               break;
+           case ADDR_WINDOWS:
+               if (eap->line1 < 1
+                       || eap->line2 > LAST_WIN_NR)
+                   return (char_u *)_(e_invrange);
+               break;
+           case ADDR_TABS:
+               if (eap->line2 > LAST_TAB_NR)
+                   return (char_u *)_(e_invrange);
+               break;
+       }
+    }
     return NULL;
 }
 
index 93d968b33e678ed8e7e321c1718ac1af30752751..c201fe713739cd3cd663c073258d65cf697518e2 100644 (file)
@@ -13,7 +13,7 @@ STARTTEST
 :" Open three tab pages and use ":tabdo"
 :0tabnew
 :1tabnew
-:888tabnew
+:$tabnew
 :tabdo call append(line('$'), 'this is tab page ' . tabpagenr())
 :tabclose! 2
 :tabrewind
index cdac0308e72fdaec6eada1d081b414a0e8dd9182..db7eadb726bafc1809d3e776f5a22104ec14936e 100644 (file)
@@ -27,10 +27,9 @@ STARTTEST
 :1arga c
 :1arga b
 :$argu
-:+arga d
 :$arga x
 :call add(arglists, argv())
-:$-10arga Y
+:0arga Y
 :call add(arglists, argv())
 :%argd
 :call add(arglists, argv())
index f591bf2614778e33463e83468f4b6fea013b1f2f..f51562620d7112023750d34d900ff625adc9ab05 100644 (file)
@@ -7,7 +7,7 @@ c
 a b d
 a d
 a
-a b c x
-Y a b c x
+a b c x
+Y a b c x
 
 a f
index 8a4e090ed56764dc8a323a9f05dc5786b20e8b00..f07da99b0f610ece536ca18cf3b5df7646bb63ae 100644 (file)
@@ -28,7 +28,7 @@ STARTTEST
 :new
 :new
 :2wincmd w
-:-2close!
+:-1close!
 :let buffers = []
 :windo call add(buffers, bufnr('%'))
 :call add(tests, buffers)
@@ -61,7 +61,7 @@ STARTTEST
 :let buffers = []
 :windo call add(buffers, bufnr('%'))
 :call add(tests, buffers)
-:9hide
+:$hide
 :let buffers = []
 :windo call add(buffers, bufnr('%'))
 :call add(tests, buffers)
index c71ae5a386d3b33ca44cd45eebc189ae613f7b69..e7dadd2bed5e6f18f8a95de1f1408f717dc48c3b 100644 (file)
@@ -1,8 +1,8 @@
 Test for user command counts       vim: set ft=vim :
 
 STARTTEST
-:let g:lines = []
 :so tiny.vim
+:let g:lines = []
 :com -range=% RangeLines :call add(g:lines, 'RangeLines '.<line1>.' '.<line2>)
 :com -range -addr=arguments RangeArguments :call add(g:lines, 'RangeArguments '.<line1>.' '.<line2>)
 :com -range=% -addr=arguments RangeArgumentsAll :call add(g:lines, 'RangeArgumentsAll '.<line1>.' '.<line2>)
@@ -48,6 +48,46 @@ STARTTEST
 :'<,'>RangeLines
 :com -range=% -buffer LocalRangeLines :call add(g:lines, 'LocalRangeLines '.<line1>.' '.<line2>)
 :'<,'>LocalRangeLines
+:b1
+ENDTEST
+
+STARTTEST
+:call add(g:lines, '')
+:%argd
+:arga a b c d
+:let v:errmsg = ''
+:5argu
+:call add(g:lines, '5argu ' . v:errmsg)
+:$argu
+:call add(g:lines, '4argu ' . expand('%:t'))
+:let v:errmsg = ''
+:1argu
+:call add(g:lines, '1argu ' . expand('%:t'))
+:let v:errmsg = ''
+:100b
+:call add(g:lines, '100b ' . v:errmsg)
+:split|split|split|split
+:let v:errmsg = ''
+:0close
+:call add(g:lines, '0close ' . v:errmsg)
+:$wincmd w
+:$close
+:call add(g:lines, '$close ' . winnr())
+:let v:errmsg = ''
+:$+close
+:call add(g:lines, '$+close ' . v:errmsg)
+:$tabe
+:call add(g:lines, '$tabe ' . tabpagenr())
+:let v:errmsg = ''
+:$+tabe
+:call add(g:lines, '$+tabe ' . v:errmsg)
+:only!
+:e x
+:0tabm
+:normal 1gt
+:call add(g:lines, '0tabm ' . expand('%:t'))
+:tabonly!
+:only!
 :e! test.out
 :call append(0, g:lines)
 :w|qa!
index 693a22d63f63b75c9941064c175e9364ea9bf23a..6e85f29d9487fff85941d345fa8b9435b2a8f9f1 100644 (file)
@@ -17,3 +17,14 @@ RangeTabsAll 1 5
 RangeLines 2 5
 LocalRangeLines 2 5
 
+5argu E16: Invalid range
+4argu d
+1argu a
+100b E16: Invalid range
+0close E16: Invalid range
+$close 4
+$+close E16: Invalid range
+$tabe 2
+$+tabe E16: Invalid range
+0tabm x
+
index 7c6b49d4e820af5096a5996500b16b41c7f61766..835afbbf020b4e652a381a196b055c4a140e76b2 100644 (file)
@@ -741,6 +741,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    565,
 /**/
     564,
 /**/