From 77b8b679195c3c247a559449c4269abf9106823c Mon Sep 17 00:00:00 2001 From: Jeremy Hylton Date: Mon, 10 Sep 2001 01:54:43 +0000 Subject: [PATCH] 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. --- Python/getargs.c | 32 +++++++++++++++++--------------- 1 file 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 -- 2.50.1