diff options
author | Andrew M. Kuchling <amk@amk.ca> | 2002-11-06 14:15:36 (GMT) |
---|---|---|
committer | Andrew M. Kuchling <amk@amk.ca> | 2002-11-06 14:15:36 (GMT) |
commit | 7e23f00948a0157452c3a76ef1057fd494e48832 (patch) | |
tree | 4152f0418ba6c0697691f7be060112a675ee72fb | |
parent | 4e7be06a652680611a81d6bb1fb03ce4227ac02e (diff) | |
download | cpython-7e23f00948a0157452c3a76ef1057fd494e48832.zip cpython-7e23f00948a0157452c3a76ef1057fd494e48832.tar.gz cpython-7e23f00948a0157452c3a76ef1057fd494e48832.tar.bz2 |
[Patch #633635 from David M. Cooke]
Make keyname raise ValueError if passed -1, avoiding a segfault
Make getkey() match the docs and raise an exception in nodelay mode
The return type of getch() is int, not chtype
-rw-r--r-- | Modules/_cursesmodule.c | 20 |
1 files changed, 14 insertions, 6 deletions
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 5361446..ea10710 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -732,7 +732,7 @@ static PyObject * PyCursesWindow_GetCh(PyCursesWindowObject *self, PyObject *args) { int x, y; - chtype rtn; + int rtn; switch (PyTuple_Size(args)) { case 0: @@ -758,7 +758,7 @@ static PyObject * PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args) { int x, y; - chtype rtn; + int rtn; switch (PyTuple_Size(args)) { case 0: @@ -777,7 +777,11 @@ PyCursesWindow_GetKey(PyCursesWindowObject *self, PyObject *args) PyErr_SetString(PyExc_TypeError, "getkey requires 0 or 2 arguments"); return NULL; } - if (rtn<=255) + if (rtn == ERR) { + /* getch() returns ERR in nodelay mode */ + PyErr_SetString(PyCursesError, "no input"); + return NULL; + } else if (rtn<=255) return Py_BuildValue("c", rtn); else #if defined(__NetBSD__) @@ -1953,6 +1957,10 @@ PyCurses_KeyName(PyObject *self, PyObject *args) if (!PyArg_ParseTuple(args,"i",&ch)) return NULL; + if (ch < 0) { + PyErr_SetString(PyExc_ValueError, "invalid key number"); + return NULL; + } knp = keyname(ch); return PyString_FromString((knp == NULL) ? "" : (char *)knp); @@ -2347,16 +2355,16 @@ static PyObject * PyCurses_UngetCh(PyObject *self, PyObject *args) { PyObject *temp; - chtype ch; + int ch; PyCursesInitialised if (!PyArg_ParseTuple(args,"O;ch or int",&temp)) return NULL; if (PyInt_Check(temp)) - ch = (chtype) PyInt_AsLong(temp); + ch = (int) PyInt_AsLong(temp); else if (PyString_Check(temp)) - ch = (chtype) *PyString_AsString(temp); + ch = (int) *PyString_AsString(temp); else { PyErr_SetString(PyExc_TypeError, "argument must be a ch or an int"); return NULL; |