diff options
author | Bram Moolenaar <Bram@vim.org> | 2013-05-12 20:36:14 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2013-05-12 20:36:14 +0200 |
commit | 8f1723de4735e437b4ced3be95d6582e713c3d7d (patch) | |
tree | b8e71cbe3ac73cc19ceee047a8bdd3d10d37b1a3 | |
parent | 3d0c52db9c3e2019bc5fe84debe59c042c3da20b (diff) | |
download | vim-git-8f1723de4735e437b4ced3be95d6582e713c3d7d.tar.gz |
updated for version 7.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.h | 25 | ||||
-rw-r--r-- | src/if_python.c | 8 | ||||
-rw-r--r-- | src/if_python3.c | 6 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 28 insertions, 13 deletions
diff --git a/src/if_py_both.h b/src/if_py_both.h index d8b0f70d9..681b7a172 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 8e3621caf..dda65affc 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 77d7cd3ce..da0867b7e 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 8bc257f5f..be2138c05 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, |