summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2006-01-09 06:24:35 +0000
committerNeal Norwitz <nnorwitz@gmail.com>2006-01-09 06:24:35 +0000
commit5e3d862392acc3b6862c6393bfbca7450523717d (patch)
tree8db6622c03bd525d1d3c7a9af5cbbebd76537225
parente0aec6df5e9549bd9e2c54ea57b6aa65d3c25f29 (diff)
downloadcpython-git-5e3d862392acc3b6862c6393bfbca7450523717d.tar.gz
Bug #1400115, Fix segfault when calling curses.panel.userptr()
without prior setting of the userptr. Will backport.
-rw-r--r--Lib/test/test_curses.py11
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_curses_panel.c5
3 files changed, 19 insertions, 0 deletions
diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py
index e137d318a8..6f843ad600 100644
--- a/Lib/test/test_curses.py
+++ b/Lib/test/test_curses.py
@@ -9,6 +9,7 @@
#
import curses, sys, tempfile, os
+import curses.panel
# Optionally test curses module. This currently requires that the
# 'curses' resource be given on the regrtest command line using the -u
@@ -213,12 +214,22 @@ def unit_tests():
print 'curses.unctrl fails on character', repr(ch)
+def test_userptr_without_set(stdscr):
+ w = curses.newwin(10, 10)
+ p = curses.panel.new_panel(w)
+ # try to access userptr() before calling set_userptr() -- segfaults
+ try:
+ p.userptr()
+ raise RuntimeError, 'userptr should fail since not set'
+ except curses.panel.error:
+ pass
def main(stdscr):
curses.savetty()
try:
module_funcs(stdscr)
window_funcs(stdscr)
+ test_userptr_without_set(stdscr)
finally:
curses.resetty()
diff --git a/Misc/NEWS b/Misc/NEWS
index 3860fd332e..2065ede0e4 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -209,6 +209,9 @@ Core and builtins
Extension Modules
-----------------
+- Bug #1400115, Fix segfault when calling curses.panel.userptr()
+ without prior setting of the userptr.
+
- Fix 64-bit problems in bsddb.
- Patch #1365916: fix some unsafe 64-bit mmap methods.
diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c
index 08c5f09ade..b5f30cb85e 100644
--- a/Modules/_curses_panel.c
+++ b/Modules/_curses_panel.c
@@ -299,6 +299,11 @@ PyCursesPanel_userptr(PyCursesPanelObject *self)
PyObject *obj;
PyCursesInitialised;
obj = (PyObject *) panel_userptr(self->pan);
+ if (obj == NULL) {
+ PyErr_SetString(PyCursesError, "no userptr set");
+ return NULL;
+ }
+
Py_INCREF(obj);
return obj;
}