summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBram Moolenaar <bram@vim.org>2013-05-12 20:36:14 +0200
committerBram Moolenaar <bram@vim.org>2013-05-12 20:36:14 +0200
commite73958c2da1d8efb905859e87bf0ce36dbfadf5f (patch)
treedcbae1e83b27dbebd6074f33d1c3c8bcc0b04fdf
parentb80098930bbd1d371a923c389c08989dba7c6d5a (diff)
downloadvim-e73958c2da1d8efb905859e87bf0ce36dbfadf5f.tar.gz
updated for version 7.3.942v7.3.942v7-3-942
Problem: Python: SEGV in Buffer functions. Solution: Call CheckBuffer() at the right time. (ZyX)
-rw-r--r--src/if_py_both.h25
-rw-r--r--src/if_python.c8
-rw-r--r--src/if_python3.c6
-rw-r--r--src/version.c2
4 files changed, 28 insertions, 13 deletions
diff --git a/src/if_py_both.h b/src/if_py_both.h
index d8b0f70d..681b7a17 100644
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -2391,6 +2391,9 @@ RBItem(BufferObject *self, PyInt n, PyInt start, PyInt end)
if (CheckBuffer(self))
return NULL;
+ if (end == -1)
+ end = self->buf->b_ml.ml_line_count;
+
if (n < 0 || n > end - start)
{
PyErr_SetString(PyExc_IndexError, _("line number out of range"));
@@ -2408,6 +2411,9 @@ RBSlice(BufferObject *self, PyInt lo, PyInt hi, PyInt start, PyInt end)
if (CheckBuffer(self))
return NULL;
+ if (end == -1)
+ end = self->buf->b_ml.ml_line_count;
+
size = end - start + 1;
if (lo < 0)
@@ -2432,6 +2438,9 @@ RBAsItem(BufferObject *self, PyInt n, PyObject *val, PyInt start, PyInt end, PyI
if (CheckBuffer(self))
return -1;
+ if (end == -1)
+ end = self->buf->b_ml.ml_line_count;
+
if (n < 0 || n > end - start)
{
PyErr_SetString(PyExc_IndexError, _("line number out of range"));
@@ -2457,6 +2466,9 @@ RBAsSlice(BufferObject *self, PyInt lo, PyInt hi, PyObject *val, PyInt start, Py
if (CheckBuffer(self))
return -1;
+ if (end == -1)
+ end = self->buf->b_ml.ml_line_count;
+
/* Sort out the slice range */
size = end - start + 1;
@@ -2493,6 +2505,9 @@ RBAppend(BufferObject *self, PyObject *args, PyInt start, PyInt end, PyInt *new_
if (CheckBuffer(self))
return NULL;
+ if (end == -1)
+ end = self->buf->b_ml.ml_line_count;
+
max = n = end - start + 1;
if (!PyArg_ParseTuple(args, "O|n", &lines, &n))
@@ -2700,15 +2715,13 @@ BufferLength(PyObject *self)
static PyObject *
BufferItem(PyObject *self, PyInt n)
{
- return RBItem((BufferObject *)(self), n, 1,
- (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count);
+ return RBItem((BufferObject *)(self), n, 1, -1);
}
static PyObject *
BufferSlice(PyObject *self, PyInt lo, PyInt hi)
{
- return RBSlice((BufferObject *)(self), lo, hi, 1,
- (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count);
+ return RBSlice((BufferObject *)(self), lo, hi, 1, -1);
}
static PyObject *
@@ -2732,9 +2745,7 @@ BufferAttr(BufferObject *this, char *name)
static PyObject *
BufferAppend(PyObject *self, PyObject *args)
{
- return RBAppend((BufferObject *)(self), args, 1,
- (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
- NULL);
+ return RBAppend((BufferObject *)(self), args, 1, -1, NULL);
}
static PyObject *
diff --git a/src/if_python.c b/src/if_python.c
index 8e3621ca..dda65aff 100644
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -1073,17 +1073,13 @@ BufferGetattr(PyObject *self, char *name)
static PyInt
BufferAssItem(PyObject *self, PyInt n, PyObject *val)
{
- return RBAsItem((BufferObject *)(self), n, val, 1,
- (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
- NULL);
+ return RBAsItem((BufferObject *)(self), n, val, 1, -1, NULL);
}
static PyInt
BufferAssSlice(PyObject *self, PyInt lo, PyInt hi, PyObject *val)
{
- return RBAsSlice((BufferObject *)(self), lo, hi, val, 1,
- (PyInt)((BufferObject *)(self))->buf->b_ml.ml_line_count,
- NULL);
+ return RBAsSlice((BufferObject *)(self), lo, hi, val, 1, -1, NULL);
}
static PySequenceMethods RangeAsSeq = {
diff --git a/src/if_python3.c b/src/if_python3.c
index 77d7cd3c..da0867b7 100644
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -1110,6 +1110,9 @@ BufferSubscript(PyObject *self, PyObject* idx)
{
Py_ssize_t start, stop, step, slicelen;
+ if (CheckBuffer((BufferObject *) self))
+ return NULL;
+
if (PySlice_GetIndicesEx((PyObject *)idx,
(Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
&start, &stop,
@@ -1139,6 +1142,9 @@ BufferAsSubscript(PyObject *self, PyObject* idx, PyObject* val)
{
Py_ssize_t start, stop, step, slicelen;
+ if (CheckBuffer((BufferObject *) self))
+ return -1;
+
if (PySlice_GetIndicesEx((PyObject *)idx,
(Py_ssize_t)((BufferObject *)(self))->buf->b_ml.ml_line_count+1,
&start, &stop,
diff --git a/src/version.c b/src/version.c
index 8bc257f5..be2138c0 100644
--- a/src/version.c
+++ b/src/version.c
@@ -729,6 +729,8 @@ static char *(features[]) =
static int included_patches[] =
{ /* Add new patch number below this line */
/**/
+ 942,
+/**/
941,
/**/
940,