Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 6c4e642

Browse files
committed
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
1 parent e067e6b commit 6c4e642

1 file changed

Lines changed: 8 additions & 7 deletions

File tree

numpy/core/src/multiarray/numpymemoryview.c

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,6 @@ NPY_NO_EXPORT PyObject *
252252
PyMemorySimpleView_FromObject(PyObject *base)
253253
{
254254
PyMemorySimpleViewObject *mview = NULL;
255-
Py_buffer view;
256255

257256
if (Py_TYPE(base)->tp_as_buffer == NULL ||
258257
Py_TYPE(base)->tp_as_buffer->bf_getbuffer == NULL) {
@@ -263,17 +262,19 @@ PyMemorySimpleView_FromObject(PyObject *base)
263262
return NULL;
264263
}
265264

266-
memset(&view, 0, sizeof(Py_buffer));
267-
if (PyObject_GetBuffer(base, &view, PyBUF_FULL_RO) < 0)
268-
return NULL;
269-
270265
mview = (PyMemorySimpleViewObject *)
271266
PyObject_GC_New(PyMemorySimpleViewObject, &PyMemorySimpleView_Type);
272267
if (mview == NULL) {
273-
PyBuffer_Release(&view);
274268
return NULL;
275269
}
276-
memcpy(&mview->view, &view, sizeof(Py_buffer));
270+
271+
memset(&mview->view, 0, sizeof(Py_buffer));
272+
mview->base = NULL;
273+
if (PyObject_GetBuffer(base, &mview->view, PyBUF_FULL_RO) < 0) {
274+
Py_DECREF(mview);
275+
return NULL;
276+
}
277+
277278
mview->base = base;
278279
Py_INCREF(base);
279280

0 commit comments

Comments
 (0)