Commit 1241ad86 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 d8568174
......@@ -250,6 +250,18 @@ def test_userptr_without_set(stdscr):
except curses.panel.error:
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):
if hasattr(curses, 'resizeterm'):
lines, cols = curses.LINES, curses.COLS
......@@ -268,6 +280,7 @@ def main(stdscr):
module_funcs(stdscr)
window_funcs(stdscr)
test_userptr_without_set(stdscr)
test_userptr_memory_leak(stdscr)
test_resize_term(stdscr)
test_issue6243(stdscr)
finally:
......
......@@ -40,6 +40,9 @@ Library
the default for linking if LDSHARED is not also overriden. This restores
Distutils behavior introduced in 2.7.3 and inadvertently dropped in 2.7.4.
- Issue #18113: Fixed a refcount leak in the curses.panel module's
set_userptr() method. Reported by Atsuo Ishimoto.
Build
-----
......
......@@ -293,6 +293,10 @@ PyCursesPanel_replace_panel(PyCursesPanelObject *self, PyObject *args)
static PyObject *
PyCursesPanel_set_panel_userptr(PyCursesPanelObject *self, PyObject *obj)
{
PyObject *oldobj;
PyCursesInitialised;
oldobj = (PyObject *) panel_userptr(self->pan);
Py_XDECREF(oldobj);
Py_INCREF(obj);
return PyCursesCheckERR(set_panel_userptr(self->pan, (void*)obj),
"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