diff Python/getargs.c @ 20723:6ac45244c41e legacy-trunk

vgetargskeywords() + Squash another potential buffer overrun. + Simplify the keyword-arg loop by decrementing the count of keywords remaining instead of incrementing Yet Another Variable; also break out early if the number of keyword args remaining hits 0. Since I hit the function's closing curly brace with this patch, that's enough of this for now <wink>.
author Tim Peters <tim.peters@gmail.com>
date Sat, 27 Oct 2001 07:25:06 +0000
parents 676f106a5002
children 225c7dd17e37
line wrap: on
line diff
--- a/Python/getargs.c	Sat Oct 27 07:00:56 2001 +0000
+++ b/Python/getargs.c	Sat Oct 27 07:25:06 2001 +0000
@@ -1033,9 +1033,7 @@
 	int min, max;
 	char *formatsave;
 	int i, len, nargs, nkeywords;
-	char *msg, *ks, **p;
-	int pos, match, converted;
-	PyObject *key, *value;
+	char *msg, **p;
 
 	assert(args != NULL && PyTuple_Check(args));
 	assert(keywords == NULL || PyDict_Check(keywords));
@@ -1150,7 +1148,8 @@
 		PyErr_SetString(PyExc_TypeError, message);
 		return 0;
 	}
-	
+
+	/* convert the positional arguments */
 	for (i = 0; i < nargs; i++) {
 		if (*format == '|')
 			format++;
@@ -1162,13 +1161,12 @@
 		}
 	}
 
-	/* handle no keyword parameters in call  */	
+	/* handle no keyword parameters in call */	
 	if (nkeywords == 0)
 		return 1; 
 
 	/* convert the keyword arguments; this uses the format 
 	   string where it was left after processing args */
-	converted = 0;
 	for (i = nargs; i < max; i++) {
 		PyObject *item;
 		if (*format == '|')
@@ -1182,7 +1180,9 @@
 				seterror(i+1, msg, levels, fname, message);
 				return 0;
 			}
-			converted++;
+			--nkeywords;
+			if (nkeywords == 0)
+				break;
 		}
 		else if (PyErr_Occurred())
 			return 0;
@@ -1196,11 +1196,12 @@
 	}
 
 	/* make sure there are no extraneous keyword arguments */
-	pos = 0;
-	if (converted < nkeywords) {
+	if (nkeywords > 0) {
+		PyObject *key, *value;
+		int pos = 0;
 		while (PyDict_Next(keywords, &pos, &key, &value)) {
-			match = 0;
-			ks = PyString_AsString(key);
+			int match = 0;
+			char *ks = PyString_AsString(key);
 			for (i = 0; i < max; i++) {
 				if (!strcmp(ks, kwlist[i])) {
 					match = 1;
@@ -1208,15 +1209,15 @@
 				}
 			}
 			if (!match) {
-				sprintf(msgbuf,
-			"%s is an invalid keyword argument for this function",
-					ks);
-				PyErr_SetString(PyExc_TypeError, msgbuf);
+				PyErr_Format(PyExc_TypeError,
+					     "'%s' is an invalid keyword "
+					     "argument for this function",
+					     ks);
 				return 0;
 			}
 		}
 	}
-	
+
 	return 1;
 }