changeset 4387:358c10968c7f v7.3.942

updated for version 7.3.942 Problem: Python: SEGV in Buffer functions. Solution: Call CheckBuffer() at the right time. (ZyX)
author Bram Moolenaar <bram@vim.org>
date Sun, 12 May 2013 20:36:14 +0200
parents 431de242920a
children a38216d77e73
files src/if_py_both.h src/if_python.c src/if_python3.c src/version.c
diffstat 4 files changed, 28 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/if_py_both.h
+++ b/src/if_py_both.h
@@ -2391,6 +2391,9 @@ RBItem(BufferObject *self, PyInt n, PyIn
     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, Py
     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, Py
     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, 
     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 *a
     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 *nam
     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 *
--- 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 = {
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -1110,6 +1110,9 @@ BufferSubscript(PyObject *self, PyObject
     {
 	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, PyObje
     {
 	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,
--- 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,