#18113: avoid segfault if Py_XDECREF triggers code that calls set_panel_userptr again
Problem noted & original patch by Serhiy Storchaka; I tweaked the patch a bit.
This commit is contained in:
parent
45d9493ee9
commit
9290dd14b0
|
@ -264,6 +264,14 @@ def test_userptr_memory_leak(stdscr):
|
||||||
if sys.getrefcount(obj) != nrefs:
|
if sys.getrefcount(obj) != nrefs:
|
||||||
raise RuntimeError("set_userptr leaked references")
|
raise RuntimeError("set_userptr leaked references")
|
||||||
|
|
||||||
|
def test_userptr_segfault(stdscr):
|
||||||
|
panel = curses.panel.new_panel(stdscr)
|
||||||
|
class A:
|
||||||
|
def __del__(self):
|
||||||
|
panel.set_userptr(None)
|
||||||
|
panel.set_userptr(A())
|
||||||
|
panel.set_userptr(None)
|
||||||
|
|
||||||
def test_resize_term(stdscr):
|
def test_resize_term(stdscr):
|
||||||
if hasattr(curses, 'resizeterm'):
|
if hasattr(curses, 'resizeterm'):
|
||||||
lines, cols = curses.LINES, curses.COLS
|
lines, cols = curses.LINES, curses.COLS
|
||||||
|
@ -330,6 +338,7 @@ def main(stdscr):
|
||||||
window_funcs(stdscr)
|
window_funcs(stdscr)
|
||||||
test_userptr_without_set(stdscr)
|
test_userptr_without_set(stdscr)
|
||||||
test_userptr_memory_leak(stdscr)
|
test_userptr_memory_leak(stdscr)
|
||||||
|
test_userptr_segfault(stdscr)
|
||||||
test_resize_term(stdscr)
|
test_resize_term(stdscr)
|
||||||
test_issue6243(stdscr)
|
test_issue6243(stdscr)
|
||||||
test_unget_wch(stdscr)
|
test_unget_wch(stdscr)
|
||||||
|
|
|
@ -323,12 +323,17 @@ static PyObject *
|
||||||
PyCursesPanel_set_panel_userptr(PyCursesPanelObject *self, PyObject *obj)
|
PyCursesPanel_set_panel_userptr(PyCursesPanelObject *self, PyObject *obj)
|
||||||
{
|
{
|
||||||
PyObject *oldobj;
|
PyObject *oldobj;
|
||||||
|
int rc;
|
||||||
PyCursesInitialised;
|
PyCursesInitialised;
|
||||||
oldobj = (PyObject *) panel_userptr(self->pan);
|
|
||||||
Py_XDECREF(oldobj);
|
|
||||||
Py_INCREF(obj);
|
Py_INCREF(obj);
|
||||||
return PyCursesCheckERR(set_panel_userptr(self->pan, (void*)obj),
|
oldobj = (PyObject *) panel_userptr(self->pan);
|
||||||
"set_panel_userptr");
|
rc = set_panel_userptr(self->pan, (void*)obj);
|
||||||
|
if (rc == ERR) {
|
||||||
|
/* In case of an ncurses error, decref the new object again */
|
||||||
|
Py_DECREF(obj);
|
||||||
|
}
|
||||||
|
Py_XDECREF(oldobj);
|
||||||
|
return PyCursesCheckERR(rc, "set_panel_userptr");
|
||||||
}
|
}
|
||||||
|
|
||||||
static PyObject *
|
static PyObject *
|
||||||
|
|
Loading…
Reference in New Issue