diff options
author | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-05-12 13:19:07 (GMT) |
---|---|---|
committer | Amaury Forgeot d'Arc <amauryfa@gmail.com> | 2008-05-12 13:19:07 (GMT) |
commit | 0740459248d1c01d393b52cff5f3a9b561e32e7c (patch) | |
tree | 8f95cf7c27597429dd2a8eed7b88f45184fcd545 /Modules | |
parent | e6161492fefafe039f416204289b97a084c771dc (diff) | |
download | cpython-0740459248d1c01d393b52cff5f3a9b561e32e7c.zip cpython-0740459248d1c01d393b52cff5f3a9b561e32e7c.tar.gz cpython-0740459248d1c01d393b52cff5f3a9b561e32e7c.tar.bz2 |
#2798: PyArg_ParseTuple did not correctly handle the "s" code in case of unicode strings
with chars outside the 7bit ascii (s# was already correct).
This is necessary to allow python run from a non-ASCII directory,
and seems enough on some platforms, probably where the default PyUnicode encoding (utf-8)
is also the default filesystem encoding.
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_testcapimodule.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index cdee975..2e68a66 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -475,6 +475,38 @@ test_k_code(PyObject *self) } +/* Test the s and z codes for PyArg_ParseTuple. +*/ +static PyObject * +test_s_code(PyObject *self) +{ + /* Unicode strings should be accepted */ + PyObject *tuple, *obj; + char *value; + + tuple = PyTuple_New(1); + if (tuple == NULL) + return NULL; + + obj = PyUnicode_Decode("t\xeate", strlen("t\xeate"), + "latin-1", NULL); + if (obj == NULL) + return NULL; + + PyTuple_SET_ITEM(tuple, 0, obj); + + /* These two blocks used to raise a TypeError: + * "argument must be string without null bytes, not str" + */ + if (PyArg_ParseTuple(tuple, "s:test_s_code1", &value) < 0) + return NULL; + + if (PyArg_ParseTuple(tuple, "z:test_s_code2", &value) < 0) + return NULL; + + Py_RETURN_NONE; +} + /* Test the u and u# codes for PyArg_ParseTuple. May leak memory in case of an error. */ @@ -952,6 +984,7 @@ static PyMethodDef TestMethods[] = { {"codec_incrementaldecoder", (PyCFunction)codec_incrementaldecoder, METH_VARARGS}, #endif + {"test_s_code", (PyCFunction)test_s_code, METH_NOARGS}, {"test_u_code", (PyCFunction)test_u_code, METH_NOARGS}, {"test_Z_code", (PyCFunction)test_Z_code, METH_NOARGS}, #ifdef WITH_THREAD |