summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Misc/NEWS9
-rw-r--r--Python/getargs.c17
2 files changed, 18 insertions, 8 deletions
diff --git a/Misc/NEWS b/Misc/NEWS
index 161be54..5bb3508 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -1,4 +1,4 @@
-What's New in Python 2.2c1?
+What's New in Python 2.2c1
XXX Release date: ??-Dec-2001 XXX
===========================
@@ -22,6 +22,13 @@ Build
C API
+- PyArg_ParseTupleAndKeywords() requires that the number of entries in
+ the keyword list equals the number of argument specifiers. This
+ wasn't checked correctly, and PyArg_ParseTupleAndKeywords could even
+ dump core in some bad cases. This has been repaired. As a result,
+ PyArg_ParseTupleAndKeywords may raise RuntimeError in bad cases that
+ previously went unchallenged.
+
New platforms
Tests
diff --git a/Python/getargs.c b/Python/getargs.c
index 3a31913..a58816f 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -1049,7 +1049,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
/* Search the format:
message <- error msg, if any (else NULL).
- name <- routine name, if any (else NULL).
+ fname <- routine name, if any (else NULL).
min <- # of required arguments, or -1 if all are required.
max <- most arguments (required + optional).
Check that kwlist has a non-NULL entry for each arg.
@@ -1064,8 +1064,9 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
if (isalpha(i) && i != 'e') {
max++;
if (*p == NULL) {
- /* kwlist is too short */
- PyErr_BadInternalCall();
+ PyErr_SetString(PyExc_RuntimeError,
+ "more argument specifiers than "
+ "keyword list entries");
return 0;
}
p++;
@@ -1081,15 +1082,17 @@ vgetargskeywords(PyObject *args, PyObject *keywords, char *format,
break;
}
else if (i == '(') {
- PyErr_SetString(PyExc_SystemError,
- "tuple found in format when using keyword arguments");
+ PyErr_SetString(PyExc_RuntimeError,
+ "tuple found in format when using keyword "
+ "arguments");
return 0;
}
}
format = formatsave;
if (*p != NULL) {
- /* kwlist is too long */
- PyErr_BadInternalCall();
+ PyErr_SetString(PyExc_RuntimeError,
+ "more keyword list entries than "
+ "argument specifiers");
return 0;
}
if (min < 0) {