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 /Python/getargs.c | |
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 'Python/getargs.c')
-rw-r--r-- | Python/getargs.c | 16 |
1 files changed, 8 insertions, 8 deletions
diff --git a/Python/getargs.c b/Python/getargs.c index 2bbafdb..427a951 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -822,10 +822,7 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } else return converterr("string", arg, msgbuf, bufsize); - /* XXX(gb): this test is completely wrong -- p is a - * byte string while arg is a Unicode. I *think* it should - * check against the size of uarg... */ - if ((Py_ssize_t)strlen(*p) != PyUnicode_GetSize(arg)) + if ((Py_ssize_t) strlen(*p) != PyString_GET_SIZE(uarg)) return converterr("string without null bytes", arg, msgbuf, bufsize); } @@ -874,11 +871,15 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, format++; } else { char **p = va_arg(*p_va, char **); + uarg = NULL; if (arg == Py_None) *p = 0; - else if (PyString_Check(arg)) + else if (PyString_Check(arg)) { + /* Enable null byte check below */ + uarg = arg; *p = PyString_AS_STRING(arg); + } else if (PyUnicode_Check(arg)) { uarg = UNICODE_DEFAULT_ENCODING(arg); if (uarg == NULL) @@ -900,9 +901,8 @@ convertsimple(PyObject *arg, const char **p_format, va_list *p_va, int flags, } format++; } - /* XXX(gb): same comment as for 's' applies here... */ - else if (*p != NULL && - (Py_ssize_t)strlen(*p) != PyUnicode_GetSize(arg)) + else if (*p != NULL && uarg != NULL && + (Py_ssize_t) strlen(*p) != PyString_GET_SIZE(uarg)) return converterr( "string without null bytes or None", arg, msgbuf, bufsize); |