Issue 25659: ctypes.Array.from_buffer segmentation fault when trying to create from array.array (original) (raw)
I'm trying to find a way to create a ctypes array from the underlying memory buffer exposed by an array.array object. The ctypes.Array.from_buffer function isn't documented, but I did find the source code in _ctypes.c around line 497. It's not clear to me where the problem might be.
Code to reproduce it below:
import array, ctypes a1 = array.array('l') a1.fromlist(range(10)) ctypes.Array.from_buffer(a1) #Segfault
You have to subclass ctypes.Array with a type and length. But ctypes types also implement sequence repetition (*) to facilitate creating array types. For example:
import array, ctypes
a1 = array.array('l')
a1.fromlist(range(10))
c1 = (ctypes.c_long * 10).from_buffer(a1)
>>> c1[:]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> c1[0] = 42
>>> a1[0]
42
That said, it's way too easy to segfault this. Why not simply fail the call in this case? e.g.
StgDictObject *dict = PyType_stgdict(type);
if (!dict) {
PyErr_SetString(PyExc_TypeError,
"abstract class");
return NULL;
}