diff -r ef8ee7a90e84 Modules/arraymodule.c --- a/Modules/arraymodule.c Sun Jun 13 13:07:57 2010 +0200 +++ b/Modules/arraymodule.c Sun Jun 13 21:36:44 2010 +0200 @@ -1335,11 +1335,19 @@ static PyObject * array_fromstring(arrayobject *self, PyObject *args) { + Py_buffer buffer; char *str; Py_ssize_t n; int itemsize = self->ob_descr->itemsize; - if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n)) + if (!PyArg_ParseTuple(args, "s*:fromstring", &buffer)) return NULL; + if (buffer.itemsize != 1) { + PyBuffer_Release(&buffer); + PyErr_SetString(PyExc_TypeError, "string/buffer of bytes required."); + return NULL; + } + str = buffer.buf; + n = buffer.len; if (n % itemsize != 0) { PyErr_SetString(PyExc_ValueError, "string length not a multiple of item size"); @@ -1357,6 +1365,7 @@ memcpy(self->ob_item + old_size * itemsize, str, n * itemsize); } + PyBuffer_Release(&buffer); Py_INCREF(Py_None); return Py_None; }