]> granicus.if.org Git - python/commitdiff
#6243: fix segfault when keyname() returns a NULL pointer.
authorAndrew M. Kuchling <amk@amk.ca>
Fri, 25 Sep 2009 22:23:54 +0000 (22:23 +0000)
committerAndrew M. Kuchling <amk@amk.ca>
Fri, 25 Sep 2009 22:23:54 +0000 (22:23 +0000)
Bug noted by Trundle, patched by Trundle and Jerry Chen.

Lib/test/test_curses.py
Modules/_cursesmodule.c

index 1b3489c49b6ec1a4460eb41e917d4e580e028133..2f7c04c3c78f7760a3e9e432df449b2a5af7d2e6 100644 (file)
@@ -257,6 +257,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:
@@ -264,6 +268,7 @@ def main(stdscr):
         window_funcs(stdscr)
         test_userptr_without_set(stdscr)
         test_resize_term(stdscr)
+        test_issue6243(stdscr)
     finally:
         curses.resetty()
 
index cd143a4ae166a2f7d18ba6e590f4d9194aa961e4..53fa432dc02f4b5b9be596f31d913ef26c9836e1 100644 (file)
@@ -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 *