diff Python/getargs.c @ 20715:5e6f8187bd48 legacy-trunk

vgetargskeywords: + Generally test nkeywords against 0 instead of keywords against NULL (saves a little work if an empty keywords dict is passed, and is conceptually more on-target regardless). + When a call erroneously specifies a keyword argument both by position and by keyword name: - It was easy to provoke this routine into an internal buffer overrun by using a long argument name. Now uses PyErr_format instead (which computes a safe buffer size). - Improved the error msg.
author Tim Peters <tim.peters@gmail.com>
date Sat, 27 Oct 2001 05:07:41 +0000
parents 091f9656d79b
children dcf769c12d8b
line wrap: on
line diff
--- a/Python/getargs.c	Sat Oct 27 04:45:34 2001 +0000
+++ b/Python/getargs.c	Sat Oct 27 05:07:41 2001 +0000
@@ -1085,16 +1085,16 @@
 	/* make sure there are no duplicate values for an argument;
 	   its not clear when to use the term "keyword argument vs. 
 	   keyword parameter in messages */
-	if (keywords) {
+	if (nkeywords > 0) {
 		for (i = 0; i < nargs; i++) {
 			char *thiskw = kwlist[i];
 			if (thiskw == NULL)
 				break;
 			if (PyMapping_HasKeyString(keywords, thiskw)) {
-				sprintf(msgbuf,
-					"keyword parameter %s redefined",
+				PyErr_Format(PyExc_TypeError,
+					"keyword parameter '%s' was given "
+					"by position and by name",
 					thiskw);
-				PyErr_SetString(PyExc_TypeError, msgbuf);
 				return 0;
 			}
 		}
@@ -1155,29 +1155,23 @@
 	}
 
 	/* handle no keyword parameters in call  */	
-	   	   
-	if (!keywords)
+	if (nkeywords == 0)
 		return 1; 
-		
+
 	/* make sure the number of keywords in the keyword list matches the 
 	   number of items in the format string */
-	  
 	nkwlist = 0;
 	p =  kwlist;
-	for (;;) {
-		if (!*(p++)) break;
+	while (*p++)
 		nkwlist++;
-	}
-
 	if (nkwlist != max) {
 		PyErr_SetString(PyExc_SystemError,
 	  "number of items in format string and keyword list do not match");
 		return 0;
 	}	  	  
-			
+		
 	/* convert the keyword arguments; this uses the format 
 	   string where it was left after processing args */
-	
 	converted = 0;
 	for (i = nargs; i < nkwlist; i++) {
 		PyObject *item;
@@ -1202,9 +1196,8 @@
 			}
 		}
 	}
-	
+
 	/* make sure there are no extraneous keyword arguments */
-	
 	pos = 0;
 	if (converted < nkeywords) {
 		while (PyDict_Next(keywords, &pos, &key, &value)) {