Kaydet (Commit) 77b8b679 authored tarafından Jeremy Hylton's avatar Jeremy Hylton

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.
üst bea3fb83
...@@ -367,7 +367,8 @@ convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels, ...@@ -367,7 +367,8 @@ convertitem(PyObject *arg, char **p_format, va_list *p_va, int *levels,
static char * static char *
converterr(char *expected, PyObject *arg, char *msgbuf) converterr(char *expected, PyObject *arg, char *msgbuf)
{ {
assert (expected != NULL); assert(expected != NULL);
assert(arg != NULL);
sprintf(msgbuf, "must be %.50s, not %.50s", expected, sprintf(msgbuf, "must be %.50s, not %.50s", expected,
arg == Py_None ? "None" : arg->ob_type->tp_name); arg == Py_None ? "None" : arg->ob_type->tp_name);
return msgbuf; return msgbuf;
...@@ -387,6 +388,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf) ...@@ -387,6 +388,7 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
{ {
char *format = *p_format; char *format = *p_format;
char c = *format++; char c = *format++;
PyObject *uarg;
switch (c) { switch (c) {
...@@ -568,12 +570,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf) ...@@ -568,12 +570,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
} }
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) { else if (PyUnicode_Check(arg)) {
arg = UNICODE_DEFAULT_ENCODING(arg); uarg = UNICODE_DEFAULT_ENCODING(arg);
if (arg == NULL) if (uarg == NULL)
return converterr(CONV_UNICODE, return converterr(CONV_UNICODE,
arg, msgbuf); arg, msgbuf);
*p = PyString_AS_STRING(arg); *p = PyString_AS_STRING(uarg);
*q = PyString_GET_SIZE(arg); *q = PyString_GET_SIZE(uarg);
} }
#endif #endif
else { /* any buffer-like object */ else { /* any buffer-like object */
...@@ -591,11 +593,11 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf) ...@@ -591,11 +593,11 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
*p = PyString_AS_STRING(arg); *p = PyString_AS_STRING(arg);
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) { else if (PyUnicode_Check(arg)) {
arg = UNICODE_DEFAULT_ENCODING(arg); uarg = UNICODE_DEFAULT_ENCODING(arg);
if (arg == NULL) if (uarg == NULL)
return converterr(CONV_UNICODE, return converterr(CONV_UNICODE,
arg, msgbuf); arg, msgbuf);
*p = PyString_AS_STRING(arg); *p = PyString_AS_STRING(uarg);
} }
#endif #endif
else else
...@@ -622,12 +624,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf) ...@@ -622,12 +624,12 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
} }
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) { else if (PyUnicode_Check(arg)) {
arg = UNICODE_DEFAULT_ENCODING(arg); uarg = UNICODE_DEFAULT_ENCODING(arg);
if (arg == NULL) if (uarg == NULL)
return converterr(CONV_UNICODE, return converterr(CONV_UNICODE,
arg, msgbuf); arg, msgbuf);
*p = PyString_AS_STRING(arg); *p = PyString_AS_STRING(uarg);
*q = PyString_GET_SIZE(arg); *q = PyString_GET_SIZE(uarg);
} }
#endif #endif
else { /* any buffer-like object */ else { /* any buffer-like object */
...@@ -648,11 +650,11 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf) ...@@ -648,11 +650,11 @@ convertsimple(PyObject *arg, char **p_format, va_list *p_va, char *msgbuf)
*p = PyString_AsString(arg); *p = PyString_AsString(arg);
#ifdef Py_USING_UNICODE #ifdef Py_USING_UNICODE
else if (PyUnicode_Check(arg)) { else if (PyUnicode_Check(arg)) {
arg = UNICODE_DEFAULT_ENCODING(arg); uarg = UNICODE_DEFAULT_ENCODING(arg);
if (arg == NULL) if (uarg == NULL)
return converterr(CONV_UNICODE, return converterr(CONV_UNICODE,
arg, msgbuf); arg, msgbuf);
*p = PyString_AS_STRING(arg); *p = PyString_AS_STRING(uarg);
} }
#endif #endif
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment