summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTim Peters <tim.peters@gmail.com>2001-02-12 22:13:26 (GMT)
committerTim Peters <tim.peters@gmail.com>2001-02-12 22:13:26 (GMT)
commit5c4d5bfaf593587032e872c30e32ab129ca15462 (patch)
treefe897df6776a52a36970f2bff5b389e6d58a9c6d
parentb86c549c7c41d5f8fa6f50ed3e58f3a1d62a1c4e (diff)
downloadcpython-5c4d5bfaf593587032e872c30e32ab129ca15462.zip
cpython-5c4d5bfaf593587032e872c30e32ab129ca15462.tar.gz
cpython-5c4d5bfaf593587032e872c30e32ab129ca15462.tar.bz2
Related to SF bug 132008 (PyList_Reverse blows up).
_testcapimodule.c make sure PyList_Reverse doesn't blow up again getargs.c assert args isn't NULL at the top of vgetargs1 instead of waiting for a NULL-pointer dereference at the end
-rw-r--r--Modules/_testcapimodule.c46
-rw-r--r--Python/getargs.c2
2 files changed, 48 insertions, 0 deletions
diff --git a/Modules/_testcapimodule.c b/Modules/_testcapimodule.c
index 1b3b596..0ffdc17 100644
--- a/Modules/_testcapimodule.c
+++ b/Modules/_testcapimodule.c
@@ -50,8 +50,54 @@ test_config(PyObject *self, PyObject *args)
return Py_None;
}
+static PyObject*
+test_list_api(PyObject *self, PyObject *args)
+{
+ PyObject* list;
+ int i;
+ if (!PyArg_ParseTuple(args, ":test_list_api"))
+ return NULL;
+
+ /* SF bug 132008: PyList_Reverse segfaults */
+#define NLIST 30
+ list = PyList_New(NLIST);
+ if (list == (PyObject*)NULL)
+ return (PyObject*)NULL;
+ /* list = range(NLIST) */
+ for (i = 0; i < NLIST; ++i) {
+ PyObject* anint = PyInt_FromLong(i);
+ if (anint == (PyObject*)NULL) {
+ Py_DECREF(list);
+ return (PyObject*)NULL;
+ }
+ PyList_SET_ITEM(list, i, anint);
+ }
+ /* list.reverse(), via PyList_Reverse() */
+ i = PyList_Reverse(list); /* should not blow up! */
+ if (i != 0) {
+ Py_DECREF(list);
+ return (PyObject*)NULL;
+ }
+ /* Check that list == range(29, -1, -1) now */
+ for (i = 0; i < NLIST; ++i) {
+ PyObject* anint = PyList_GET_ITEM(list, i);
+ if (PyInt_AS_LONG(anint) != NLIST-1-i) {
+ PyErr_SetString(TestError,
+ "test_list_api: reverse screwed up");
+ Py_DECREF(list);
+ return (PyObject*)NULL;
+ }
+ }
+ Py_DECREF(list);
+#undef NLIST
+
+ Py_INCREF(Py_None);
+ return Py_None;
+}
+
static PyMethodDef TestMethods[] = {
{"test_config", test_config, METH_VARARGS},
+ {"test_list_api", test_list_api, METH_VARARGS},
{NULL, NULL} /* sentinel */
};
diff --git a/Python/getargs.c b/Python/getargs.c
index aa4a228..00f298a 100644
--- a/Python/getargs.c
+++ b/Python/getargs.c
@@ -84,6 +84,8 @@ vgetargs1(PyObject *args, char *format, va_list *p_va, int compat)
int i, len;
char *msg;
+ assert(compat || (args != (PyObject*)NULL));
+
for (;;) {
int c = *format++;
if (c == '(' /* ')' */) {