summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBram Moolenaar <Bram@vim.org>2020-07-07 20:12:54 +0200
committerBram Moolenaar <Bram@vim.org>2020-07-07 20:12:54 +0200
commitbb790dcc46b74e6f9a1c4126be8a575f9fe73444 (patch)
treec17157a26c3b5b3bbfc87fa88067ee06aec7cf08
parent007f9d6ed597bd212acb95be9d0767c97d2a1438 (diff)
patch 8.2.1150: ml_get error when using Pythonv8.2.1150
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".
-rw-r--r--src/if_py_both.h15
-rw-r--r--src/testdir/test_python2.vim12
-rw-r--r--src/testdir/test_python3.vim12
-rw-r--r--src/version.c2
4 files changed, 24 insertions, 17 deletions
diff --git a/src/if_py_both.h b/src/if_py_both.h
index c7df93be2a..5bd6a0e677 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -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);
diff --git a/src/testdir/test_python2.vim b/src/testdir/test_python2.vim
index f0b9b06c72..0d41f391a3 100644
--- 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
diff --git a/src/testdir/test_python3.vim b/src/testdir/test_python3.vim
index b3cfbf37c4..1fb22fc7bd 100644
--- 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
diff --git a/src/version.c b/src/version.c
index 3c8b1431c5..d00c960f4c 100644
--- a/src/version.c
+++ b/src/version.c
@@ -755,6 +755,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 1150,
+/**/
1149,
/**/
1148,