summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCharles Harris <charlesr.harris@gmail.com>2014-02-22 12:39:42 -0700
committerCharles Harris <charlesr.harris@gmail.com>2014-02-22 12:39:42 -0700
commit826d13702dd28cff729595e37658611f4719067b (patch)
tree5af7a1d3eebb9356f1a9da222d779ae177ed371c
parentd2fd1af156ac095156d3fbf833392b644e61c226 (diff)
parent6c4e64204df6f336b617ff0447d0ea104cdf1ae6 (diff)
downloadnumpy-826d13702dd28cff729595e37658611f4719067b.tar.gz
Merge pull request #4350 from seberg/buffer-fixes
Buffer fixes
-rw-r--r--numpy/core/src/multiarray/buffer.c11
-rw-r--r--numpy/core/src/multiarray/numpymemoryview.c15
2 files changed, 16 insertions, 10 deletions
diff --git a/numpy/core/src/multiarray/buffer.c b/numpy/core/src/multiarray/buffer.c
index 4c1d476d5..b59729822 100644
--- a/numpy/core/src/multiarray/buffer.c
+++ b/numpy/core/src/multiarray/buffer.c
@@ -805,18 +805,19 @@ _descriptor_from_pep3118_format(char *s)
if (*s == ':') {
in_name = !in_name;
*p = *s;
+ p++;
}
else if (in_name || !NumPyOS_ascii_isspace(*s)) {
*p = *s;
+ p++;
}
- ++p;
- ++s;
+ s++;
}
*p = '\0';
str = PyUString_FromStringAndSize(buf, strlen(buf));
- free(buf);
if (str == NULL) {
+ free(buf);
return NULL;
}
@@ -824,6 +825,7 @@ _descriptor_from_pep3118_format(char *s)
_numpy_internal = PyImport_ImportModule("numpy.core._internal");
if (_numpy_internal == NULL) {
Py_DECREF(str);
+ free(buf);
return NULL;
}
descr = PyObject_CallMethod(
@@ -833,14 +835,17 @@ _descriptor_from_pep3118_format(char *s)
if (descr == NULL) {
PyErr_Format(PyExc_ValueError,
"'%s' is not a valid PEP 3118 buffer format string", buf);
+ free(buf);
return NULL;
}
if (!PyArray_DescrCheck(descr)) {
PyErr_Format(PyExc_RuntimeError,
"internal error: numpy.core._internal._dtype_from_pep3118 "
"did not return a valid dtype, got %s", buf);
+ free(buf);
return NULL;
}
+ free(buf);
return (PyArray_Descr*)descr;
}
diff --git a/numpy/core/src/multiarray/numpymemoryview.c b/numpy/core/src/multiarray/numpymemoryview.c
index 27c02e592..ccc5f33ed 100644
--- a/numpy/core/src/multiarray/numpymemoryview.c
+++ b/numpy/core/src/multiarray/numpymemoryview.c
@@ -252,7 +252,6 @@ NPY_NO_EXPORT PyObject *
PyMemorySimpleView_FromObject(PyObject *base)
{
PyMemorySimpleViewObject *mview = NULL;
- Py_buffer view;
if (Py_TYPE(base)->tp_as_buffer == NULL ||
Py_TYPE(base)->tp_as_buffer->bf_getbuffer == NULL) {
@@ -263,17 +262,19 @@ PyMemorySimpleView_FromObject(PyObject *base)
return NULL;
}
- memset(&view, 0, sizeof(Py_buffer));
- if (PyObject_GetBuffer(base, &view, PyBUF_FULL_RO) < 0)
- return NULL;
-
mview = (PyMemorySimpleViewObject *)
PyObject_GC_New(PyMemorySimpleViewObject, &PyMemorySimpleView_Type);
if (mview == NULL) {
- PyBuffer_Release(&view);
return NULL;
}
- memcpy(&mview->view, &view, sizeof(Py_buffer));
+
+ memset(&mview->view, 0, sizeof(Py_buffer));
+ mview->base = NULL;
+ if (PyObject_GetBuffer(base, &mview->view, PyBUF_FULL_RO) < 0) {
+ Py_DECREF(mview);
+ return NULL;
+ }
+
mview->base = base;
Py_INCREF(base);