Mercurial > vim
changeset 21198:8531ddd7dd63 v8.2.1150
patch 8.2.1150: ml_get error when using Python
Commit: https://github.com/vim/vim/commit/bb790dcc46b74e6f9a1c4126be8a575f9fe73444
Author: Bram Moolenaar <Bram@vim.org>
Date: Tue Jul 7 20:12:54 2020 +0200
patch 8.2.1150: ml_get error when using Python
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".
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Tue, 07 Jul 2020 20:15:04 +0200 |
parents | d68512f02811 |
children | a9ce04b178c4 |
files | src/if_py_both.h src/testdir/test_python2.vim src/testdir/test_python3.vim src/version.c |
diffstat | 4 files changed, 25 insertions(+), 18 deletions(-) [+] |
line wrap: on
line diff
--- a/src/if_py_both.h +++ b/src/if_py_both.h @@ -3374,7 +3374,7 @@ OptionsItem(OptionsObject *self, PyObjec 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, PyOb 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, for (i = 0; i < n; ++i) { - PyObject *string = LineToString( - (char *)ml_get_buf(buf, (linenr_T)(lo+i), FALSE)); - - // Error check - was the Python string creation OK? + linenr_T lnum = (linenr_T)(lo + i); + char *text; + PyObject *string; + + 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);
--- a/src/testdir/test_python2.vim +++ b/src/testdir/test_python2.vim @@ -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
--- a/src/testdir/test_python3.vim +++ b/src/testdir/test_python3.vim @@ -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