diff options
author | Sebastian Berg <sebastian@sipsolutions.net> | 2014-02-22 18:18:23 +0100 |
---|---|---|
committer | Sebastian Berg <sebastian@sipsolutions.net> | 2014-02-22 18:35:01 +0100 |
commit | 6c4e64204df6f336b617ff0447d0ea104cdf1ae6 (patch) | |
tree | 58e7ec6e3c71c85dd5dd5cff857f66232abed407 | |
parent | e067e6b0cbdc45cb0ad4073b18cb18492810b035 (diff) | |
download | numpy-6c4e64204df6f336b617ff0447d0ea104cdf1ae6.tar.gz |
BUG: Hang on to originally filled Py_Buffer view.
When filling the python buffer view object, python sets
view.shape = &view.len (ndim=1, so this works). If we copy
the view info into our Memoryview object instead of having
it directly filled &view.len points into nirvana.
Closes gh-3175
-rw-r--r-- | numpy/core/src/multiarray/numpymemoryview.c | 15 |
1 files changed, 8 insertions, 7 deletions
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); |