diff options
-rw-r--r-- | Misc/NEWS | 9 | ||||
-rw-r--r-- | Python/getargs.c | 17 |
2 files changed, 18 insertions, 8 deletions
@@ -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) { |