summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-11-29 03:26:37 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-11-29 03:26:37 (GMT)
commitcffed4bc2162e453a8458d3014e23fa07b627aff (patch)
treeb36a24eaaea05b20201f562ca35d4415528f67a6
parent42f5332f6de308c1d9b8f4df076aacf87d23ac11 (diff)
downloadcpython-cffed4bc2162e453a8458d3014e23fa07b627aff.zip
cpython-cffed4bc2162e453a8458d3014e23fa07b627aff.tar.gz
cpython-cffed4bc2162e453a8458d3014e23fa07b627aff.tar.bz2
SF bug 486278 SystemError: Python/getargs.c:1086: bad.
vgetargskeywords(): Now that this routine is checking for bad input (rather than dump core in some cases), some bad calls are raising errors that previously "worked". This patch makes the error strings more revealing, and changes the exceptions from SystemError to RuntimeError (under the theory that SystemError is more of a "can't happen!" assert- like thing, and so inappropriate for bad arguments to a public C API function).
-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) {