summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2001-09-10 01:54:43 (GMT)
committerJeremy Hylton <jeremy@alum.mit.edu>2001-09-10 01:54:43 (GMT)
commit77b8b679195c3c247a559449c4269abf9106823c (patch)
treebb0c738fd573fcd09e0768e68cf7898511c3cf01
parentbea3fb83a76db479bb7c523fd8c16f7bc23f4336 (diff)
downloadcpython-77b8b679195c3c247a559449c4269abf9106823c.zip
cpython-77b8b679195c3c247a559449c4269abf9106823c.tar.gz
cpython-77b8b679195c3c247a559449c4269abf9106823c.tar.bz2
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
Reported by Fredrik Lundh on python-dev. The conversimple() code that handles Unicode arguments and converts them to the default encoding now calls converterr() with the original Unicode argument instead of the NULL returned by the failed encoding attempt.
-rw-r--r--Python/getargs.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/Python/getargs.c b/Python/getargs.c
index a4dc57a..16373d9 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -367,7 +367,8 @@ convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
static char *
converterr(char *expected, PyObject *arg, char *msgbuf)
{
- assert (expected != NULL);
+ assert(expected != NULL);
+ assert(arg != NULL);
sprintf(msgbuf, "must be %.50s, not %.50s", expected,
arg == Py_None ? "None" : arg->ob_type->tp_name);
return msgbuf;
@@ -387,6 +388,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
{
char *format = *p_format;
char c = *format++;
+ PyObject *uarg;
switch (c) {
@@ -568,12 +570,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
}
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
- arg = UNICODE_DEFAULT_ENCODING(arg);
- if (arg == NULL)
+ uarg = UNICODE_DEFAULT_ENCODING(arg);
+ if (uarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf);
- *p = PyString_AS_STRING(arg);
- *q = PyString_GET_SIZE(arg);
+ *p = PyString_AS_STRING(uarg);
+ *q = PyString_GET_SIZE(uarg);
}
#endif
else { /* any buffer-like object */
@@ -591,11 +593,11 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
*p = PyString_AS_STRING(arg);
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
- arg = UNICODE_DEFAULT_ENCODING(arg);
- if (arg == NULL)
+ uarg = UNICODE_DEFAULT_ENCODING(arg);
+ if (uarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf);
- *p = PyString_AS_STRING(arg);
+ *p = PyString_AS_STRING(uarg);
}
#endif
else
@@ -622,12 +624,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
}
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
- arg = UNICODE_DEFAULT_ENCODING(arg);
- if (arg == NULL)
+ uarg = UNICODE_DEFAULT_ENCODING(arg);
+ if (uarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf);
- *p = PyString_AS_STRING(arg);
- *q = PyString_GET_SIZE(arg);
+ *p = PyString_AS_STRING(uarg);
+ *q = PyString_GET_SIZE(uarg);
}
#endif
else { /* any buffer-like object */
@@ -648,11 +650,11 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
*p = PyString_AsString(arg);
#ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) {
- arg = UNICODE_DEFAULT_ENCODING(arg);
- if (arg == NULL)
+ uarg = UNICODE_DEFAULT_ENCODING(arg);
+ if (uarg == NULL)
return converterr(CONV_UNICODE,
arg, msgbuf);
- *p = PyString_AS_STRING(arg);
+ *p = PyString_AS_STRING(uarg);
}
#endif
else