]> granicus.if.org Git - python/commitdiff
Fix core dump in PyArg_ParseTuple() with Unicode arguments.
authorJeremy Hylton <jeremy@alum.mit.edu>
Mon, 10 Sep 2001 01:54:43 +0000 (01:54 +0000)
committerJeremy Hylton <jeremy@alum.mit.edu>
Mon, 10 Sep 2001 01:54:43 +0000 (01:54 +0000)
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

index a4dc57a8c326c25d5ca6be726edd3299bcd97e24..16373d9b756c632af0d8c9c8f9a9fbe524c8f600 100644 (file)
@@ -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