mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	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
					
				
					 3 changed files with 23 additions and 16 deletions
				
			
		|  | @ -3609,6 +3609,12 @@ def test_memoryview_from_static_exporter(self): | |||
|                     lst=lst) | ||||
|         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): | ||||
|         x = ndarray([1,2,3], shape=[3], flags=ND_GETBUF_FAIL) | ||||
|         self.assertRaises(BufferError, memoryview, x) | ||||
|  |  | |||
|  | @ -44,23 +44,21 @@ static PyTypeObject NDArray_Type; | |||
| #define ADJUST_PTR(ptr, suboffsets) \ | ||||
|     (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 */ | ||||
| #define ND_VAREXPORT        0x001   /* change layout while buffers are exported */ | ||||
| 
 | ||||
| /* User configurable flags for each base buffer */ | ||||
| #define ND_WRITABLE         0x002   /* mark base buffer as writable */ | ||||
| #define ND_FORTRAN          0x004   /* Fortran contiguous layout */ | ||||
| #define ND_SCALAR           0x008   /* scalar: ndim = 0 */ | ||||
| #define ND_PIL              0x010   /* convert to PIL-style array (suboffsets) */ | ||||
| #define ND_GETBUF_FAIL  0x020   /* test issue 7385 */ | ||||
| #define ND_REDIRECT     0x040   /* redirect buffer requests */ | ||||
| 
 | ||||
| /* Default: NumPy style (strides), read-only, no var-export, C-style layout */ | ||||
| #define ND_DEFAULT      0x0 | ||||
| 
 | ||||
| #define ND_REDIRECT         0x020   /* redirect buffer requests */ | ||||
| #define ND_GETBUF_FAIL      0x040   /* trigger getbuffer failure */ | ||||
| #define ND_GETBUF_UNDEFINED 0x080   /* undefined view.obj */ | ||||
| /* Internal flags for the base buffer */ | ||||
| #define ND_C            0x080   /* C contiguous layout (default) */ | ||||
| #define ND_OWN_ARRAYS   0x100   /* consumer owns arrays */ | ||||
| #define ND_C                0x100   /* C contiguous layout (default) */ | ||||
| #define ND_OWN_ARRAYS       0x200   /* consumer owns arrays */ | ||||
| 
 | ||||
| /* ndarray properties */ | ||||
| #define ND_IS_CONSUMER(nd) \ | ||||
|  | @ -1449,6 +1447,8 @@ ndarray_getbuf(NDArrayObject *self, Py_buffer *view, int flags) | |||
|     if (baseflags & ND_GETBUF_FAIL) { | ||||
|         PyErr_SetString(PyExc_BufferError, | ||||
|             "ND_GETBUF_FAIL: forced test exception"); | ||||
|         if (baseflags & ND_GETBUF_UNDEFINED) | ||||
|             view->obj = (PyObject *)0x1; /* wrong but permitted in <= 3.2 */ | ||||
|         return -1; | ||||
|     } | ||||
| 
 | ||||
|  | @ -2782,6 +2782,7 @@ PyInit__testbuffer(void) | |||
|     PyModule_AddIntConstant(m, "ND_SCALAR", ND_SCALAR); | ||||
|     PyModule_AddIntConstant(m, "ND_PIL", ND_PIL); | ||||
|     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, "PyBUF_SIMPLE", PyBUF_SIMPLE); | ||||
|  |  | |||
|  | @ -86,7 +86,7 @@ _PyManagedBuffer_FromObject(PyObject *base) | |||
|         return NULL; | ||||
| 
 | ||||
|     if (PyObject_GetBuffer(base, &mbuf->master, PyBUF_FULL_RO) < 0) { | ||||
|         /* mbuf->master.obj must be NULL. */ | ||||
|         mbuf->master.obj = NULL; | ||||
|         Py_DECREF(mbuf); | ||||
|         return NULL; | ||||
|     } | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Stefan Krah
						Stefan Krah