]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 8.2.1150: ml_get error when using Python v8.2.1150
authorBram Moolenaar <Bram@vim.org>
Tue, 7 Jul 2020 18:12:54 +0000 (20:12 +0200)
committerBram Moolenaar <Bram@vim.org>
Tue, 7 Jul 2020 18:12:54 +0000 (20:12 +0200)
Problem:    ml_get error when using Python. (Yegappan Lakshmanan)
Solution:   Check the line number is not out of range.  Call "Check" with
            "fromObj" instead of "from".

src/if_py_both.h
src/testdir/test_python2.vim
src/testdir/test_python3.vim
src/version.c

index c7df93be2a052105ef85648929eb145aa4c07787..5bd6a0e67728a0d6b50402b7733298df980a3549 100644 (file)
@@ -3374,7 +3374,7 @@ OptionsItem(OptionsObject *self, PyObject *keyObject)
     char_u     *stringval;
     PyObject   *todecref;
 
-    if (self->Check(self->from))
+    if (self->Check(self->fromObj))
        return NULL;
 
     if (!(key = StringToChars(keyObject, &todecref)))
@@ -3565,7 +3565,7 @@ OptionsAssItem(OptionsObject *self, PyObject *keyObject, PyObject *valObject)
     int                ret = 0;
     PyObject   *todecref;
 
-    if (self->Check(self->from))
+    if (self->Check(self->fromObj))
        return -1;
 
     if (!(key = StringToChars(keyObject, &todecref)))
@@ -4334,10 +4334,15 @@ GetBufferLineList(buf_T *buf, PyInt lo, PyInt hi)
 
     for (i = 0; i < n; ++i)
     {
-       PyObject        *string = LineToString(
-               (char *)ml_get_buf(buf, (linenr_T)(lo+i), FALSE));
+       linenr_T        lnum = (linenr_T)(lo + i);
+       char            *text;
+       PyObject        *string;
 
-       // Error check - was the Python string creation OK?
+       if (lnum > buf->b_ml.ml_line_count)
+           text = "";
+       else
+           text = (char *)ml_get_buf(buf, lnum, FALSE);
+       string = LineToString(text);
        if (string == NULL)
        {
            Py_DECREF(list);
index f0b9b06c7214e3c1c90c8d218e62a8b534cee9ad..0d41f391a31403c0a1454b22b5a3b40cc71cf9bf 100644 (file)
@@ -278,9 +278,9 @@ func Test_python_range()
   py r[1:0] = ["d"]
   call assert_equal(['c', 'd', 'a', 'two', 'three', 'b'], getline(1, '$'))
 
-  " FIXME: The following code triggers ml_get errors
-  %d
-  let x = pyeval('r[:]')
+  " The following code used to trigger an ml_get error
+  %d
+  let x = pyeval('r[:]')
 
   " Non-existing range attribute
   call AssertException(["let x = pyeval('r.abc')"],
@@ -332,9 +332,9 @@ func Test_python_window()
   call AssertException(["py vim.current.window = w"],
         \ 'Vim(python):vim.error: attempt to refer to deleted window')
   " Try to set one of the options of the closed window
-  " FIXME: The following causes ASAN failure
-  "call AssertException(["py wopts['list'] = False"],
-  "      \ 'vim.error: problem while switching windows')
+  " The following caused an ASAN failure
+  call AssertException(["py wopts['list'] = False"],
+        \ 'vim.error: attempt to refer to deleted window')
   call assert_match('<window object (deleted)', pyeval("repr(w)"))
   %bw!
 endfunc
index b3cfbf37c498134e1b52fad038ebae0960e243c7..1fb22fc7bd9e16d158d66abc3dcd8d3515439a7d 100644 (file)
@@ -462,9 +462,9 @@ func Test_python3_range2()
   py3 r[1:0] = ["d"]
   call assert_equal(['c', 'd', 'a', 'two', 'three', 'b'], getline(1, '$'))
 
-  " FIXME: The following code triggers ml_get errors
-  %d
-  let x = py3eval('r[:]')
+  " The following code used to trigger an ml_get error
+  %d
+  let x = py3eval('r[:]')
 
   " Non-existing range attribute
   call AssertException(["let x = py3eval('r.abc')"],
@@ -516,9 +516,9 @@ func Test_python3_window()
   call AssertException(["py3 vim.current.window = w"],
         \ 'Vim(py3):vim.error: attempt to refer to deleted window')
   " Try to set one of the options of the closed window
-  " FIXME: The following causes ASAN failure
-  "call AssertException(["py3 wopts['list'] = False"],
-  "      \ 'Vim(py3):vim.error: problem while switching windows')
+  " The following caused ASAN failure
+  call AssertException(["py3 wopts['list'] = False"],
+        \ 'Vim(py3):vim.error: attempt to refer to deleted window')
   call assert_match('<window object (deleted)', py3eval("repr(w)"))
   %bw!
 endfunc
index 3c8b1431c51fc405e261a92cae7c1701ad12e306..d00c960f4ce6e47634942c012476eb3841d14fe2 100644 (file)
@@ -754,6 +754,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1150,
 /**/
     1149,
 /**/