Mercurial > vim
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,