summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew M. Kuchling <amk@amk.ca>2010-02-22 17:06:22 +0000
committerAndrew M. Kuchling <amk@amk.ca>2010-02-22 17:06:22 +0000
commit47d960ec4a50b0f77fc49f05e3f133225370524e (patch)
tree86c9a0fbdd7f362aec65a5db31ca5c53049eb404
parent63553d1829ddd5987706a6f6079a9e2093f23b7e (diff)
downloadcpython-git-47d960ec4a50b0f77fc49f05e3f133225370524e.tar.gz
Merged revisions 75066 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk ........ r75066 | andrew.kuchling | 2009-09-25 18:23:54 -0400 (Fri, 25 Sep 2009) | 4 lines #6243: fix segfault when keyname() returns a NULL pointer. Bug noted by Trundle, patched by Trundle and Jerry Chen. ........
-rw-r--r--Lib/test/test_curses.py5
-rw-r--r--Misc/NEWS3
-rw-r--r--Modules/_cursesmodule.c11
3 files changed, 15 insertions, 4 deletions
diff --git a/Lib/test/test_curses.py b/Lib/test/test_curses.py
index cdb90dbf8b..4439fcd13c 100644
--- a/Lib/test/test_curses.py
+++ b/Lib/test/test_curses.py
@@ -261,6 +261,10 @@ def test_resize_term(stdscr):
if curses.LINES != lines - 1 or curses.COLS != cols + 1:
raise RuntimeError, "Expected resizeterm to update LINES and COLS"
+def test_issue6243(stdscr):
+ curses.ungetch(1025)
+ stdscr.getkey()
+
def main(stdscr):
curses.savetty()
try:
@@ -268,6 +272,7 @@ def main(stdscr):
window_funcs(stdscr)
test_userptr_without_set(stdscr)
test_resize_term(stdscr)
+ test_issue6243(stdscr)
finally:
curses.resetty()
diff --git a/Misc/NEWS b/Misc/NEWS
index 589590e266..9882fad4d7 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -66,6 +66,9 @@ Core and Builtins
Library
-------
+- Issue #6243: curses.getkey() can segfault when used with ungetch.
+ Fix by Trundle and Jerry Chen.
+
- Issue #7597: curses.use_env() can now be called before initscr().
Noted by Kan-Ru Chen.
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c
index 4a77b0552a..e2c17e1c18 100644
--- a/Modules/_cursesmodule.c
+++ b/Modules/_cursesmodule.c
@@ -882,14 +882,17 @@ PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args)
/* getch() returns ERR in nodelay mode */
PyErr_SetString(PyCursesError, "no input");
return NULL;
- } else if (rtn<=255)
+ } else if (rtn<=255) {
return Py_BuildValue("c", rtn);
- else
+ } else {
+ const char *knp;
#if defined(__NetBSD__)
- return PyString_FromString(unctrl(rtn));
+ knp = unctrl(rtn);
#else
- return PyString_FromString((char *)keyname(rtn));
+ knp = keyname(rtn);
#endif
+ return PyString_FromString((knp == NULL) ? "" : knp);
+ }
}
static PyObject *