diff Python/getargs.c @ 39409:8022927c17a8 2.4

Backport fixes for #1523610 (crashes in PyArg_ParseTuple): rev. 51158 and rev. 50843.
author Georg Brandl <georg@python.org>
date Wed, 09 Aug 2006 07:15:29 +0000
parents e0d29586212a
children
line wrap: on
line diff
--- a/Python/getargs.c	Tue Aug 08 20:13:16 2006 +0000
+++ b/Python/getargs.c	Wed Aug 09 07:15:29 2006 +0000
@@ -144,6 +144,9 @@
 			if (level == 0)
 				max++;
 			level++;
+			if (level >= 30)
+				Py_FatalError("too many tuple nesting levels "
+					      "in argument format string");
 			break;
 		case ')':
 			if (level == 0)
@@ -287,8 +290,8 @@
 				      "argument %d", iarg);
 			i = 0;
 			p += strlen(p);
-			while (levels[i] > 0 && (int)(p-buf) < 220) {
-				PyOS_snprintf(p, sizeof(buf) - (buf - p),
+			while (levels[i] > 0 && i < 32 && (int)(p-buf) < 220) {
+				PyOS_snprintf(p, sizeof(buf) - (p - buf),
 					      ", item %d", levels[i]-1);
 				p += strlen(p);
 				i++;
@@ -374,6 +377,13 @@
 		char *msg;
 		PyObject *item;
 		item = PySequence_GetItem(arg, i);
+ 		if (item == NULL) {
+ 			PyErr_Clear();
+ 			levels[0] = i+1;
+ 			levels[1] = 0;
+ 			strncpy(msgbuf, "is not retrievable", bufsize);
+ 			return msgbuf;
+ 		}
 		msg = convertitem(item, &format, p_va, levels+1, msgbuf,
 				  bufsize, freelist);
 		/* PySequence_GetItem calls tp->sq_item, which INCREFs */
@@ -1361,6 +1371,7 @@
 		else {
 			msg = skipitem(&format, p_va);
 			if (msg) {
+				levels[0] = 0;
 				seterror(i+1, msg, levels, fname, message);
 				return cleanreturn(0, freelist);
 			}