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