Commit 53e5ea79 authored by Andrew Kuchling's avatar Andrew Kuchling

#18113: Objects associated to a curses.panel object with set_userptr() were leaked.

Reported by Atsuo Ishimoto.
parent 27bbfdbc
...@@ -252,6 +252,18 @@ def test_userptr_without_set(stdscr): ...@@ -252,6 +252,18 @@ def test_userptr_without_set(stdscr):
except curses.panel.error: except curses.panel.error:
pass pass
def test_userptr_memory_leak(stdscr):
w = curses.newwin(10, 10)
p = curses.panel.new_panel(w)
obj = object()
nrefs = sys.getrefcount(obj)
for i in range(100):
p.set_userptr(obj)
p.set_userptr(None)
if sys.getrefcount(obj) != nrefs:
raise RuntimeError("set_userptr leaked references")
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
...@@ -317,6 +329,7 @@ def main(stdscr): ...@@ -317,6 +329,7 @@ def main(stdscr):
module_funcs(stdscr) module_funcs(stdscr)
window_funcs(stdscr) window_funcs(stdscr)
test_userptr_without_set(stdscr) test_userptr_without_set(stdscr)
test_userptr_memory_leak(stdscr)
test_resize_term(stdscr) test_resize_term(stdscr)
test_issue6243(stdscr) test_issue6243(stdscr)
test_unget_wch(stdscr) test_unget_wch(stdscr)
......
...@@ -78,6 +78,9 @@ Library ...@@ -78,6 +78,9 @@ Library
the default for linking if LDSHARED is not also overriden. This restores the default for linking if LDSHARED is not also overriden. This restores
Distutils behavior introduced in 3.2.3 and inadvertently dropped in 3.3.0. Distutils behavior introduced in 3.2.3 and inadvertently dropped in 3.3.0.
- Issue #18113: Fixed a refcount leak in the curses.panel module's
set_userptr() method. Reported by Atsuo Ishimoto.
IDLE IDLE
---- ----
......
...@@ -322,6 +322,10 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args) ...@@ -322,6 +322,10 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)
static PyObject * static PyObject *
PyCursesPanel_set_panel_userptr(PyCursesPanelObject *self, PyObject *obj) PyCursesPanel_set_panel_userptr(PyCursesPanelObject *self, PyObject *obj)
{ {
PyObject *oldobj;
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), return PyCursesCheckERR(set_panel_userptr(self->pan, (void*)obj),
"set_panel_userptr"); "set_panel_userptr");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment