mirror of
https://github.com/python/cpython.git
synced 2025-08-04 00:48:58 +00:00
Issue #26168: Fixed possible refleaks in failing Py_BuildValue() with the "N"
format unit.
This commit is contained in:
parent
3dc5129d4f
commit
13e602ea0f
4 changed files with 173 additions and 55 deletions
|
@ -872,6 +872,100 @@ test_L_code(PyObject *self)
|
|||
|
||||
#endif /* ifdef HAVE_LONG_LONG */
|
||||
|
||||
static PyObject *
|
||||
return_none(void *unused)
|
||||
{
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
raise_error(void *unused)
|
||||
{
|
||||
PyErr_SetNone(PyExc_ValueError);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int
|
||||
test_buildvalue_N_error(const char *fmt)
|
||||
{
|
||||
PyObject *arg, *res;
|
||||
|
||||
arg = PyList_New(0);
|
||||
if (arg == NULL) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_INCREF(arg);
|
||||
res = Py_BuildValue(fmt, return_none, NULL, arg);
|
||||
if (res == NULL) {
|
||||
return -1;
|
||||
}
|
||||
Py_DECREF(res);
|
||||
if (Py_REFCNT(arg) != 1) {
|
||||
PyErr_Format(TestError, "test_buildvalue_N: "
|
||||
"arg was not decrefed in successful "
|
||||
"Py_BuildValue(\"%s\")", fmt);
|
||||
return -1;
|
||||
}
|
||||
|
||||
Py_INCREF(arg);
|
||||
res = Py_BuildValue(fmt, raise_error, NULL, arg);
|
||||
if (res != NULL || !PyErr_Occurred()) {
|
||||
PyErr_Format(TestError, "test_buildvalue_N: "
|
||||
"Py_BuildValue(\"%s\") didn't complain", fmt);
|
||||
return -1;
|
||||
}
|
||||
PyErr_Clear();
|
||||
if (Py_REFCNT(arg) != 1) {
|
||||
PyErr_Format(TestError, "test_buildvalue_N: "
|
||||
"arg was not decrefed in failed "
|
||||
"Py_BuildValue(\"%s\")", fmt);
|
||||
return -1;
|
||||
}
|
||||
Py_DECREF(arg);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static PyObject *
|
||||
test_buildvalue_N(PyObject *self, PyObject *noargs)
|
||||
{
|
||||
PyObject *arg, *res;
|
||||
|
||||
arg = PyList_New(0);
|
||||
if (arg == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
Py_INCREF(arg);
|
||||
res = Py_BuildValue("N", arg);
|
||||
if (res == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
if (res != arg) {
|
||||
return raiseTestError("test_buildvalue_N",
|
||||
"Py_BuildValue(\"N\") returned wrong result");
|
||||
}
|
||||
if (Py_REFCNT(arg) != 2) {
|
||||
return raiseTestError("test_buildvalue_N",
|
||||
"arg was not decrefed in Py_BuildValue(\"N\")");
|
||||
}
|
||||
Py_DECREF(res);
|
||||
Py_DECREF(arg);
|
||||
|
||||
if (test_buildvalue_N_error("O&N") < 0)
|
||||
return NULL;
|
||||
if (test_buildvalue_N_error("(O&N)") < 0)
|
||||
return NULL;
|
||||
if (test_buildvalue_N_error("[O&N]") < 0)
|
||||
return NULL;
|
||||
if (test_buildvalue_N_error("{O&N}") < 0)
|
||||
return NULL;
|
||||
if (test_buildvalue_N_error("{()O&(())N}") < 0)
|
||||
return NULL;
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
|
||||
static PyObject *
|
||||
get_args(PyObject *self, PyObject *args)
|
||||
{
|
||||
|
@ -3728,6 +3822,7 @@ static PyMethodDef TestMethods[] = {
|
|||
{"test_pep3118_obsolete_write_locks", (PyCFunction)test_pep3118_obsolete_write_locks, METH_NOARGS},
|
||||
#endif
|
||||
{"getbuffer_with_null_view", getbuffer_with_null_view, METH_O},
|
||||
{"test_buildvalue_N", test_buildvalue_N, METH_NOARGS},
|
||||
{"get_args", get_args, METH_VARARGS},
|
||||
{"get_kwargs", (PyCFunction)get_kwargs, METH_VARARGS|METH_KEYWORDS},
|
||||
{"getargs_tuple", getargs_tuple, METH_VARARGS},
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue