mirror of https://github.com/python/cpython
Issue #14181: Preserve backwards compatibility for getbufferprocs that a) do
not adhere to the new documentation and b) manage to clobber view->obj before returning failure.
This commit is contained in:
parent
bf6c7eca43
commit
1649c1b33a
|
@ -3609,6 +3609,12 @@ class TestBufferProtocol(unittest.TestCase):
|
||||||
lst=lst)
|
lst=lst)
|
||||||
del x, y, z, m
|
del x, y, z, m
|
||||||
|
|
||||||
|
def test_memoryview_getbuffer_undefined(self):
|
||||||
|
|
||||||
|
# getbufferproc does not adhere to the new documentation
|
||||||
|
nd = ndarray([1,2,3], [3], flags=ND_GETBUF_FAIL|ND_GETBUF_UNDEFINED)
|
||||||
|
self.assertRaises(BufferError, memoryview, nd)
|
||||||
|
|
||||||
def test_issue_7385(self):
|
def test_issue_7385(self):
|
||||||
x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL)
|
x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL)
|
||||||
self.assertRaises(BufferError, memoryview, x)
|
self.assertRaises(BufferError, memoryview, x)
|
||||||
|
|
|
@ -44,23 +44,21 @@ static PyTypeObject NDArray_Type;
|
||||||
#define ADJUST_PTR(ptr, suboffsets) \
|
#define ADJUST_PTR(ptr, suboffsets) \
|
||||||
(HAVE_PTR(suboffsets) ? *((char**)ptr) + suboffsets[0] : ptr)
|
(HAVE_PTR(suboffsets) ? *((char**)ptr) + suboffsets[0] : ptr)
|
||||||
|
|
||||||
|
/* Default: NumPy style (strides), read-only, no var-export, C-style layout */
|
||||||
|
#define ND_DEFAULT 0x000
|
||||||
/* User configurable flags for the ndarray */
|
/* User configurable flags for the ndarray */
|
||||||
#define ND_VAREXPORT 0x001 /* change layout while buffers are exported */
|
#define ND_VAREXPORT 0x001 /* change layout while buffers are exported */
|
||||||
|
|
||||||
/* User configurable flags for each base buffer */
|
/* User configurable flags for each base buffer */
|
||||||
#define ND_WRITABLE 0x002 /* mark base buffer as writable */
|
#define ND_WRITABLE 0x002 /* mark base buffer as writable */
|
||||||
#define ND_FORTRAN 0x004 /* Fortran contiguous layout */
|
#define ND_FORTRAN 0x004 /* Fortran contiguous layout */
|
||||||
#define ND_SCALAR 0x008 /* scalar: ndim = 0 */
|
#define ND_SCALAR 0x008 /* scalar: ndim = 0 */
|
||||||
#define ND_PIL 0x010 /* convert to PIL-style array (suboffsets) */
|
#define ND_PIL 0x010 /* convert to PIL-style array (suboffsets) */
|
||||||
#define ND_GETBUF_FAIL 0x020 /* test issue 7385 */
|
#define ND_REDIRECT 0x020 /* redirect buffer requests */
|
||||||
#define ND_REDIRECT 0x040 /* redirect buffer requests */
|
#define ND_GETBUF_FAIL 0x040 /* trigger getbuffer failure */
|
||||||
|
#define ND_GETBUF_UNDEFINED 0x080 /* undefined view.obj */
|
||||||
/* Default: NumPy style (strides), read-only, no var-export, C-style layout */
|
|
||||||
#define ND_DEFAULT 0x0
|
|
||||||
|
|
||||||
/* Internal flags for the base buffer */
|
/* Internal flags for the base buffer */
|
||||||
#define ND_C 0x080 /* C contiguous layout (default) */
|
#define ND_C 0x100 /* C contiguous layout (default) */
|
||||||
#define ND_OWN_ARRAYS 0x100 /* consumer owns arrays */
|
#define ND_OWN_ARRAYS 0x200 /* consumer owns arrays */
|
||||||
|
|
||||||
/* ndarray properties */
|
/* ndarray properties */
|
||||||
#define ND_IS_CONSUMER(nd) \
|
#define ND_IS_CONSUMER(nd) \
|
||||||
|
@ -1449,6 +1447,8 @@ ndarray_getbuf(NDArrayObject *self, Py_buffer *view, int flags)
|
||||||
if (baseflags & ND_GETBUF_FAIL) {
|
if (baseflags & ND_GETBUF_FAIL) {
|
||||||
PyErr_SetString(PyExc_BufferError,
|
PyErr_SetString(PyExc_BufferError,
|
||||||
"ND_GETBUF_FAIL: forced test exception");
|
"ND_GETBUF_FAIL: forced test exception");
|
||||||
|
if (baseflags & ND_GETBUF_UNDEFINED)
|
||||||
|
view->obj = (PyObject *)0x1; /* wrong but permitted in <= 3.2 */
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2782,6 +2782,7 @@ PyInit__testbuffer(void)
|
||||||
PyModule_AddIntConstant(m, "ND_SCALAR", ND_SCALAR);
|
PyModule_AddIntConstant(m, "ND_SCALAR", ND_SCALAR);
|
||||||
PyModule_AddIntConstant(m, "ND_PIL", ND_PIL);
|
PyModule_AddIntConstant(m, "ND_PIL", ND_PIL);
|
||||||
PyModule_AddIntConstant(m, "ND_GETBUF_FAIL", ND_GETBUF_FAIL);
|
PyModule_AddIntConstant(m, "ND_GETBUF_FAIL", ND_GETBUF_FAIL);
|
||||||
|
PyModule_AddIntConstant(m, "ND_GETBUF_UNDEFINED", ND_GETBUF_UNDEFINED);
|
||||||
PyModule_AddIntConstant(m, "ND_REDIRECT", ND_REDIRECT);
|
PyModule_AddIntConstant(m, "ND_REDIRECT", ND_REDIRECT);
|
||||||
|
|
||||||
PyModule_AddIntConstant(m, "PyBUF_SIMPLE", PyBUF_SIMPLE);
|
PyModule_AddIntConstant(m, "PyBUF_SIMPLE", PyBUF_SIMPLE);
|
||||||
|
|
|
@ -86,7 +86,7 @@ _PyManagedBuffer_FromObject(PyObject *base)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if (PyObject_GetBuffer(base, &mbuf->master, PyBUF_FULL_RO) < 0) {
|
if (PyObject_GetBuffer(base, &mbuf->master, PyBUF_FULL_RO) < 0) {
|
||||||
/* mbuf->master.obj must be NULL. */
|
mbuf->master.obj = NULL;
|
||||||
Py_DECREF(mbuf);
|
Py_DECREF(mbuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue