summaryrefslogtreecommitdiffstats
path: root/Objects
diff options
context:
space:
mode:
authorAntoine Pitrou <solipsis@pitrou.net>2008-12-06 21:29:24 (GMT)
committerAntoine Pitrou <solipsis@pitrou.net>2008-12-06 21:29:24 (GMT)
commitae5beceb35384da8eed64940e5632d62c4907576 (patch)
tree109dd6656e786be70aa1ca7054742059f91e68d0 /Objects
parent45313fe6e0fbb546e9cb781136b098b6eb8c92c7 (diff)
downloadcpython-ae5beceb35384da8eed64940e5632d62c4907576.zip
cpython-ae5beceb35384da8eed64940e5632d62c4907576.tar.gz
cpython-ae5beceb35384da8eed64940e5632d62c4907576.tar.bz2
Issue #4509: bugs in bytearray with exports (buffer protocol)
Diffstat (limited to 'Objects')
-rw-r--r--Objects/bytearrayobject.c42
1 files changed, 31 insertions, 11 deletions
diff --git a/Objects/bytearrayobject.c b/Objects/bytearrayobject.c
index 99bb0f2..d75eb53 100644
--- a/Objects/bytearrayobject.c
+++ b/Objects/bytearrayobject.c
@@ -154,6 +154,17 @@ _getbuffer(PyObject *obj, Py_buffer *view)
return view->len;
}
+static int
+_canresize(PyByteArrayObject *self)
+{
+ if (self->ob_exports > 0) {
+ PyErr_SetString(PyExc_BufferError,
+ "Existing exports of data: object cannot be re-sized");
+ return 0;
+ }
+ return 1;
+}
+
/* Direct API functions */
PyObject *
@@ -229,6 +240,13 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t size)
assert(PyByteArray_Check(self));
assert(size >= 0);
+ if (size == Py_SIZE(self)) {
+ return 0;
+ }
+ if (!_canresize((PyByteArrayObject *)self)) {
+ return -1;
+ }
+
if (size < alloc / 2) {
/* Major downsize; resize down to exact size */
alloc = size + 1;
@@ -248,16 +266,6 @@ PyByteArray_Resize(PyObject *self, Py_ssize_t size)
alloc = size + 1;
}
- if (((PyByteArrayObject *)self)->ob_exports > 0) {
- /*
- fprintf(stderr, "%d: %s", ((PyByteArrayObject *)self)->ob_exports,
- ((PyByteArrayObject *)self)->ob_bytes);
- */
- PyErr_SetString(PyExc_BufferError,
- "Existing exports of data: object cannot be re-sized");
- return -1;
- }
-
sval = PyMem_Realloc(((PyByteArrayObject *)self)->ob_bytes, alloc);
if (sval == NULL) {
PyErr_NoMemory();
@@ -522,6 +530,10 @@ bytes_setslice(PyByteArrayObject *self, Py_ssize_t lo, Py_ssize_t hi,
if (avail != needed) {
if (avail > needed) {
+ if (!_canresize(self)) {
+ res = -1;
+ goto finish;
+ }
/*
0 lo hi old_size
| |<----avail----->|<-----tomove------>|
@@ -654,6 +666,8 @@ bytes_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
stop = start;
if (step == 1) {
if (slicelen != needed) {
+ if (!_canresize(self))
+ return -1;
if (slicelen > needed) {
/*
0 start stop old_size
@@ -689,6 +703,8 @@ bytes_ass_subscript(PyByteArrayObject *self, PyObject *index, PyObject *values)
/* Delete slice */
Py_ssize_t cur, i;
+ if (!_canresize(self))
+ return -1;
if (step < 0) {
stop = start + 1;
start = stop + step * (slicelen - 1) - 1;
@@ -1473,7 +1489,7 @@ bytes_translate(PyByteArrayObject *self, PyObject *args)
}
goto done;
}
-
+
for (i = 0; i < 256; i++)
trans_table[i] = Py_CHARMASK(table[i]);
@@ -2730,6 +2746,8 @@ bytes_pop(PyByteArrayObject *self, PyObject *args)
PyErr_SetString(PyExc_IndexError, "pop index out of range");
return NULL;
}
+ if (!_canresize(self))
+ return NULL;
value = self->ob_bytes[where];
memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where);
@@ -2760,6 +2778,8 @@ bytes_remove(PyByteArrayObject *self, PyObject *arg)
PyErr_SetString(PyExc_ValueError, "value not found in bytes");
return NULL;
}
+ if (!_canresize(self))
+ return NULL;
memmove(self->ob_bytes + where, self->ob_bytes + where + 1, n - where);
if (PyByteArray_Resize((PyObject *)self, n - 1) < 0)