Commit 65d3b977 authored by Lars Buitinck's avatar Lars Buitinck

fix shrinking and overflow in cpython.array

parent 16f809e6
......@@ -121,13 +121,15 @@ static CYTHON_INLINE int resize(arrayobject *self, Py_ssize_t n) {
static CYTHON_INLINE int resize_smart(arrayobject *self, Py_ssize_t n) {
void *items = (void*) self->data.ob_item;
Py_ssize_t newsize;
if (n < self->allocated) {
if (n*4 > self->allocated) {
self->ob_size = n;
return 0;
}
if (n < self->ob_size) {
self->ob_size = n;
return 0;
}
newsize = n + (n / 2) + 1;
if (newsize <= self->allocated) { /* overflow */
PyErr_NoMemory();
return -1;
}
newsize = n * 3 / 2 + 1;
PyMem_Resize(items, char, (size_t)(newsize * self->ob_descr->itemsize));
if (items == NULL) {
PyErr_NoMemory();
......
......@@ -105,6 +105,16 @@ def test_resize(a):
assert len(cb) == 10
assert cb[9] == cb[-1] == cb.data.as_floats[9] == 9
def test_resize_smart(a):
"""
>>> a = array.array('d', [1, 2, 3])
>>> test_resize_smart(a)
2
"""
cdef array.array cb = array.copy(a)
array.resize_smart(cb, 2)
return len(cb)
def test_buffer():
"""
>>> test_buffer()
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment