I get this error every so often when trying to use surfarray.make_surface: Traceback (most recent call last): [...] File "/home/weeble/py/minecraft_mapping/tilemapping.py", line 348, in hacky_map_render resources = make_resources(pygame.surfarray.make_surface(pixels)) File "/usr/local/lib/python2.6/dist-packages/pygame/surfarray.py", line 243, in make_surface return numpysf.make_surface (array) File "/usr/local/lib/python2.6/dist-packages/pygame/_numpysurfarray.py", line 368, in make_surface blit_array (surface, array) File "/usr/local/lib/python2.6/dist-packages/pygame/_numpysurfarray.py", line 437, in blit_array surface.get_buffer ().write (data, 0) IndexError: bytes to write exceed buffer size
I've put some print statements into _numpysurfarray.py and the length of the buffer and the length of data are always identical. I think the problem is in bufferproxy.c: /** * Writes raw data to the buffer. */ static PyObject* _bufferproxy_write (PyBufferProxy *buffer, PyObject *args) { Py_ssize_t offset; Py_ssize_t length; char *buf; if (!PyArg_ParseTuple (args, "s#i", &buf, &length, &offset)) return NULL; if (offset + length > buffer->length) { return RAISE (PyExc_IndexError, "bytes to write exceed buffer size"); } memcpy (((Uint8 *)buffer->buffer) + offset, buf, (size_t) length); Py_RETURN_NONE; } Here offset is defined as a Py_ssize_t, but I believe the "i" format tells PyArg_ParseTuple to expect an int. On most 64-bit platforms, sizeof(int)==4 and I believe sizeof(Py_ssize_t)==8. It looks to me like part of offset is left uninitialized, resulting in the error if it happens not to be 0. Is my analysis correct?