Mercurial > cpython-lru_cache-weakref
diff Python/getargs.c @ 19820:fe5ec1a3a7e0 legacy-trunk
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.
| author | Jeremy Hylton <jeremy@alum.mit.edu> |
|---|---|
| date | Mon, 10 Sep 2001 01:54:43 +0000 |
| parents | 3e7897822459 |
| children | c0d662966272 |
line wrap: on
line diff
--- a/Python/getargs.c Mon Sep 10 01:39:21 2001 +0000 +++ b/Python/getargs.c Mon Sep 10 01:54:43 2001 +0000 @@ -367,7 +367,8 @@ 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 @@ { char *format = *p_format; char c = *format++; + PyObject *uarg; switch (c) { @@ -568,12 +570,12 @@ } #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 @@ *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 @@ } #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 @@ *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
