]> granicus.if.org Git - vim/commitdiff
patch 8.0.1416: crash when searching for a sentence v8.0.1416
authorBram Moolenaar <Bram@vim.org>
Tue, 19 Dec 2017 20:23:21 +0000 (21:23 +0100)
committerBram Moolenaar <Bram@vim.org>
Tue, 19 Dec 2017 20:23:21 +0000 (21:23 +0100)
Problem:    Crash when searching for a sentence.
Solution:   Return NUL when getting character at MAXCOL. (closes #2468)

src/ex_docmd.c
src/misc1.c
src/misc2.c
src/testdir/test_search.vim
src/version.c

index 84a72e112bbed23ddce5ed90d7edecf0f68bd88b..539e39fb425356e1c650facd2de268be579125c8 100644 (file)
@@ -4521,13 +4521,14 @@ get_address(
                    if (lnum != MAXLNUM)
                        curwin->w_cursor.lnum = lnum;
                    /*
-                    * Start a forward search at the end of the line.
+                    * Start a forward search at the end of the line (unless
+                    * before the first line).
                     * Start a backward search at the start of the line.
                     * This makes sure we never match in the current
                     * line, and can match anywhere in the
                     * next/previous line.
                     */
-                   if (c == '/')
+                   if (c == '/' && curwin->w_cursor.lnum > 0)
                        curwin->w_cursor.col = MAXCOL;
                    else
                        curwin->w_cursor.col = 0;
index 4c691bb258c7f1485db70d173c6a804d38ff2507..2d635d677faafe35b1764d492388fd62f8a2d691 100644 (file)
@@ -2650,8 +2650,12 @@ del_lines(
     int
 gchar_pos(pos_T *pos)
 {
-    char_u     *ptr = ml_get_pos(pos);
+    char_u     *ptr;
 
+    /* When searching columns is sometimes put at the end of a line. */
+    if (pos->col == MAXCOL)
+       return NUL;
+    ptr = ml_get_pos(pos);
 #ifdef FEAT_MBYTE
     if (has_mbyte)
        return (*mb_ptr2char)(ptr);
index 87b79fae1eb82272253e337d681ab8a90b7c4734..fd432cdba3e05e4a4825d6b5a4b5b2e8a44e751f 100644 (file)
@@ -348,24 +348,29 @@ inc_cursor(void)
     int
 inc(pos_T *lp)
 {
-    char_u  *p = ml_get_pos(lp);
+    char_u  *p;
 
-    if (*p != NUL)     /* still within line, move to next char (may be NUL) */
+    /* when searching position may be set to end of a line */
+    if (lp->col != MAXCOL)
     {
-#ifdef FEAT_MBYTE
-       if (has_mbyte)
+       p = ml_get_pos(lp);
+       if (*p != NUL)  /* still within line, move to next char (may be NUL) */
        {
-           int l = (*mb_ptr2len)(p);
+#ifdef FEAT_MBYTE
+           if (has_mbyte)
+           {
+               int l = (*mb_ptr2len)(p);
 
-           lp->col += l;
-           return ((p[l] != NUL) ? 0 : 2);
-       }
+               lp->col += l;
+               return ((p[l] != NUL) ? 0 : 2);
+           }
 #endif
-       lp->col++;
+           lp->col++;
 #ifdef FEAT_VIRTUALEDIT
-       lp->coladd = 0;
+           lp->coladd = 0;
 #endif
-       return ((p[1] != NUL) ? 0 : 2);
+           return ((p[1] != NUL) ? 0 : 2);
+       }
     }
     if (lp->lnum != curbuf->b_ml.ml_line_count)     /* there is a next line */
     {
index cb65fbf0ba7d6e598ec093b7ac246336af570fb7..84edfbbd4c719d5829c5ca3881fc7a89d82eef5f 100644 (file)
@@ -729,3 +729,10 @@ func Test_look_behind()
   call search(getline("."))
   bwipe!
 endfunc
+
+func Test_search_sentence()
+  new
+  " this used to cause a crash
+  call assert_fails("/\\%'", 'E486')
+  call assert_fails("/", 'E486')
+endfunc
index 7b2f89a77c9862fe6259d61d199a9bd94ef8ef3c..11ff6038eed155287106160aae9df0e80da9da0c 100644 (file)
@@ -771,6 +771,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1416,
 /**/
     1415,
 /**/