summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2017-11-01 18:48:49 (GMT)
committerGitHub <noreply@github.com>2017-11-01 18:48:49 (GMT)
commit4f469c096628af730b17798d0ebfd8925bfde836 (patch)
treea161dd6075c64a45b7f16713a48df39d3c618b76 /Modules
parent7e68790f3db75a893d5dd336e6201a63bc70212b (diff)
downloadcpython-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.c38
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