summaryrefslogtreecommitdiff
path: root/Python/getargs.c
diff options
context:
space:
mode:
authorJeremy Hylton <jeremy@alum.mit.edu>2001-09-10 01:54:43 +0000
committerJeremy Hylton <jeremy@alum.mit.edu>2001-09-10 01:54:43 +0000
commitd58bc30748ab7fd39ab5541e93a47af30a3dfe90 (patch)
tree641b43728b2bb0dbb0defa4b76228c0e9e083b93 /Python/getargs.c
parentf0dcdea96b187732df0a57db7185ccb9c9772b64 (diff)
downloadcpython-d58bc30748ab7fd39ab5541e93a47af30a3dfe90.tar.gz
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.
Diffstat (limited to 'Python/getargs.c')
-rw-r--r--Python/getargs.c32
1 files changed, 17 insertions, 15 deletions
diff --git a/Python/getargs.c b/Python/getargs.c
index a4dc57a8c3..16373d9b75 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