From: Benjamin Peterson Date: Mon, 22 Dec 2008 20:51:15 +0000 (+0000) Subject: fix #4720: the format to PyArg_ParseTupleAndKeywords can now start with '|' X-Git-Tag: v2.7a1~2509 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=4caef5c7e2f3b0de2725d83e8eab20f5dd3d6195;p=python fix #4720: the format to PyArg_ParseTupleAndKeywords can now start with '|' --- diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c index adb04c0bb8..d7ec73031d 100644 --- a/Modules/_testcapimodule.c +++ b/Modules/_testcapimodule.c @@ -518,6 +518,32 @@ test_u_code(PyObject *self) return Py_None; } +static PyObject * +test_empty_argparse(PyObject *self) +{ + /* Test that formats can begin with '|'. See issue #4720. */ + PyObject *tuple, *dict = NULL; + static char *kwlist[] = {NULL}; + int result; + tuple = PyTuple_New(0); + if (!tuple) + return NULL; + if ((result = PyArg_ParseTuple(tuple, "|:test_empty_argparse")) < 0) + goto done; + dict = PyDict_New(); + if (!dict) + goto done; + result = PyArg_ParseTupleAndKeywords(tuple, dict, "|:test_empty_argparse", kwlist); + done: + Py_DECREF(tuple); + Py_XDECREF(dict); + if (result < 0) + return NULL; + else { + Py_RETURN_NONE; + } +} + static PyObject * codec_incrementalencoder(PyObject *self, PyObject *args) { @@ -780,6 +806,7 @@ static PyMethodDef TestMethods[] = { {"test_long_api", (PyCFunction)test_long_api, METH_NOARGS}, {"test_long_numbits", (PyCFunction)test_long_numbits, METH_NOARGS}, {"test_k_code", (PyCFunction)test_k_code, METH_NOARGS}, + {"test_empty_argparse", (PyCFunction)test_empty_argparse,METH_NOARGS}, {"test_null_strings", (PyCFunction)test_null_strings, METH_NOARGS}, {"test_string_from_format", (PyCFunction)test_string_from_format, METH_NOARGS}, {"test_with_docstring", (PyCFunction)test_with_docstring, METH_NOARGS, diff --git a/Python/getargs.c b/Python/getargs.c index 9d1f0b218b..544948b928 100644 --- a/Python/getargs.c +++ b/Python/getargs.c @@ -1601,7 +1601,7 @@ vgetargskeywords(PyObject *args, PyObject *keywords, const char *format, } } - if (!IS_END_OF_FORMAT(*format)) { + if (!IS_END_OF_FORMAT(*format) && *format != '|') { PyErr_Format(PyExc_RuntimeError, "more argument specifiers than keyword list entries " "(remaining format:'%s')", format);