diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2017-11-01 18:48:49 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-11-01 18:48:49 (GMT) |
commit | 4f469c096628af730b17798d0ebfd8925bfde836 (patch) | |
tree | a161dd6075c64a45b7f16713a48df39d3c618b76 /Modules | |
parent | 7e68790f3db75a893d5dd336e6201a63bc70212b (diff) | |
download | cpython-4f469c096628af730b17798d0ebfd8925bfde836.zip cpython-4f469c096628af730b17798d0ebfd8925bfde836.tar.gz cpython-4f469c096628af730b17798d0ebfd8925bfde836.tar.bz2 |
bpo-27666: Fixed stack corruption in curses.box() and curses.ungetmouse(). (#4220)
Diffstat (limited to 'Modules')
-rw-r--r-- | Modules/_cursesmodule.c | 38 |
1 files changed, 26 insertions, 12 deletions
diff --git a/Modules/_cursesmodule.c b/Modules/_cursesmodule.c index 1f6897a..ae1905b 100644 --- a/Modules/_cursesmodule.c +++ b/Modules/_cursesmodule.c @@ -911,12 +911,19 @@ PyCursesWindow_Border(PyCursesWindowObject *self, PyObject *args) static PyObject * PyCursesWindow_Box(PyCursesWindowObject *self, PyObject *args) { + PyObject *temp1, *temp2; chtype ch1=0,ch2=0; switch(PyTuple_Size(args)){ case 0: break; default: - if (!PyArg_ParseTuple(args,"ll;vertint,horint", &ch1, &ch2)) + if (!PyArg_ParseTuple(args,"OO;verch,horch", &temp1, &temp2)) return NULL; + if (!PyCurses_ConvertToChtype(self, temp1, &ch1)) { + return NULL; + } + if (!PyCurses_ConvertToChtype(self, temp2, &ch2)) { + return NULL; + } } box(self->win,ch1,ch2); Py_RETURN_NONE; @@ -2268,24 +2275,30 @@ PyCurses_GetMouse(PyObject *self) PyErr_SetString(PyCursesError, "getmouse() returned ERR"); return NULL; } - return Py_BuildValue("(hiiil)", + return Py_BuildValue("(hiiik)", (short)event.id, - event.x, event.y, event.z, - (long) event.bstate); + (int)event.x, (int)event.y, (int)event.z, + (unsigned long) event.bstate); } static PyObject * PyCurses_UngetMouse(PyObject *self, PyObject *args) { MEVENT event; + short id; + int x, y, z; + unsigned long bstate; PyCursesInitialised; - if (!PyArg_ParseTuple(args, "hiiil", - &event.id, - &event.x, &event.y, &event.z, - (int *) &event.bstate)) + if (!PyArg_ParseTuple(args, "hiiik", + &id, &x, &y, &z, &bstate)) return NULL; + event.id = id; + event.x = x; + event.y = y; + event.z = z; + event.bstate = bstate; return PyCursesCheckERR(ungetmouse(&event), "ungetmouse"); } #endif @@ -2669,14 +2682,15 @@ PyCurses_MouseInterval(PyObject *self, PyObject *args) static PyObject * PyCurses_MouseMask(PyObject *self, PyObject *args) { - int newmask; + unsigned long newmask; mmask_t oldmask, availmask; PyCursesInitialised; - if (!PyArg_ParseTuple(args,"i;mousemask",&newmask)) + if (!PyArg_ParseTuple(args,"k;mousemask",&newmask)) return NULL; - availmask = mousemask(newmask, &oldmask); - return Py_BuildValue("(ll)", (long)availmask, (long)oldmask); + availmask = mousemask((mmask_t)newmask, &oldmask); + return Py_BuildValue("(kk)", + (unsigned long)availmask, (unsigned long)oldmask); } #endif |