summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-05-12 13:19:07 (GMT)
committerAmaury Forgeot d'Arc <amauryfa@gmail.com>2008-05-12 13:19:07 (GMT)
commit0740459248d1c01d393b52cff5f3a9b561e32e7c (patch)
tree8f95cf7c27597429dd2a8eed7b88f45184fcd545 /Modules
parente6161492fefafe039f416204289b97a084c771dc (diff)
downloadcpython-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.c33
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