diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2014-09-11 07:38:08 (GMT) |
---|---|---|
committer | Serhiy Storchaka <storchaka@gmail.com> | 2014-09-11 07:38:08 (GMT) |
commit | 1c09c0ea1107a8fbb22c949235a0950b9a98e252 (patch) | |
tree | dd06f802f88782a0b7295fcb03e978b316d6c586 /Modules/_tkinter.c | |
parent | 08578b0d3b8a4f629878267085d3856a0742853c (diff) | |
download | cpython-1c09c0ea1107a8fbb22c949235a0950b9a98e252.zip cpython-1c09c0ea1107a8fbb22c949235a0950b9a98e252.tar.gz cpython-1c09c0ea1107a8fbb22c949235a0950b9a98e252.tar.bz2 |
Issue #21951: Use attemptckalloc() instead of ckalloc() in Tkinter.
ckalloc() causes the Tcl interpreter to panic, attemptckalloc() returns NULL
if the memory allocation fails.
Diffstat (limited to 'Modules/_tkinter.c')
-rw-r--r-- | Modules/_tkinter.c | 40 |
1 files changed, 28 insertions, 12 deletions
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c index fe35882..d0a4464 100644 --- a/Modules/_tkinter.c +++ b/Modules/_tkinter.c @@ -408,8 +408,8 @@ Merge(PyObject *args) PyErr_SetString(PyExc_OverflowError, "tuple is too long"); goto finally; } - argv = (char **)ckalloc((size_t)argc * sizeof(char *)); - fv = (int *)ckalloc((size_t)argc * sizeof(int)); + argv = (char **)attemptckalloc((size_t)argc * sizeof(char *)); + fv = (int *)attemptckalloc((size_t)argc * sizeof(int)); if (argv == NULL || fv == NULL) { PyErr_NoMemory(); goto finally; @@ -754,7 +754,7 @@ Tkapp_New(char *screenName, char *baseName, char *className, Tcl_SetVar(v->interp, "tcl_interactive", "0", TCL_GLOBAL_ONLY); /* This is used to get the application class for Tk 4.1 and up */ - argv0 = (char*)ckalloc(strlen(className) + 1); + argv0 = (char*)attemptckalloc(strlen(className) + 1); if (!argv0) { PyErr_NoMemory(); Py_DECREF(v); @@ -788,7 +788,7 @@ Tkapp_New(char *screenName, char *baseName, char *className, if (use) len += strlen(use) + sizeof "-use "; - args = (char*)ckalloc(len); + args = (char*)attemptckalloc(len); if (!args) { PyErr_NoMemory(); Py_DECREF(v); @@ -1056,7 +1056,7 @@ AsObj(PyObject *value) PyErr_SetString(PyExc_OverflowError, "tuple is too long"); return NULL; } - argv = (Tcl_Obj **) ckalloc(((size_t)size) * sizeof(Tcl_Obj *)); + argv = (Tcl_Obj **) attemptckalloc(((size_t)size) * sizeof(Tcl_Obj *)); if(!argv) return 0; for (i = 0; i < size; i++) @@ -1083,7 +1083,7 @@ AsObj(PyObject *value) return Tcl_NewUnicodeObj(inbuf, size); allocsize = ((size_t)size) * sizeof(Tcl_UniChar); if (allocsize >= size) - outbuf = (Tcl_UniChar*)ckalloc(allocsize); + outbuf = (Tcl_UniChar*)attemptckalloc(allocsize); /* Else overflow occurred, and we take the next exit */ if (!outbuf) { PyErr_NoMemory(); @@ -1272,7 +1272,7 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc) PyErr_SetString(PyExc_OverflowError, "tuple is too long"); return NULL; } - objv = (Tcl_Obj **)ckalloc(((size_t)objc) * sizeof(Tcl_Obj *)); + objv = (Tcl_Obj **)attemptckalloc(((size_t)objc) * sizeof(Tcl_Obj *)); if (objv == NULL) { PyErr_NoMemory(); objc = 0; @@ -1410,7 +1410,11 @@ Tkapp_Call(PyObject *selfptr, PyObject *args) PyObject *exc_type, *exc_value, *exc_tb; if (!WaitForMainloop(self)) return NULL; - ev = (Tkapp_CallEvent*)ckalloc(sizeof(Tkapp_CallEvent)); + ev = (Tkapp_CallEvent*)attemptckalloc(sizeof(Tkapp_CallEvent)); + if (ev == NULL) { + PyErr_NoMemory(); + return NULL; + } ev->ev.proc = (Tcl_EventProc*)Tkapp_CallProc; ev->self = self; ev->args = args; @@ -1700,8 +1704,11 @@ var_invoke(EventFunc func, PyObject *selfptr, PyObject *args, int flags) if (!WaitForMainloop(self)) return NULL; - ev = (VarEvent*)ckalloc(sizeof(VarEvent)); - + ev = (VarEvent*)attemptckalloc(sizeof(VarEvent)); + if (ev == NULL) { + PyErr_NoMemory(); + return NULL; + } ev->self = selfptr; ev->args = args; ev->flags = flags; @@ -2312,7 +2319,12 @@ Tkapp_CreateCommand(PyObject *selfptr, PyObject *args) #ifdef WITH_THREAD if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { Tcl_Condition cond = NULL; - CommandEvent *ev = (CommandEvent*)ckalloc(sizeof(CommandEvent)); + CommandEvent *ev = (CommandEvent*)attemptckalloc(sizeof(CommandEvent)); + if (ev == NULL) { + PyErr_NoMemory(); + PyMem_DEL(data); + return NULL; + } ev->ev.proc = (Tcl_EventProc*)Tkapp_CommandProc; ev->interp = self->interp; ev->create = 1; @@ -2359,7 +2371,11 @@ Tkapp_DeleteCommand(PyObject *selfptr, PyObject *args) if (self->threaded && self->thread_id != Tcl_GetCurrentThread()) { Tcl_Condition cond = NULL; CommandEvent *ev; - ev = (CommandEvent*)ckalloc(sizeof(CommandEvent)); + ev = (CommandEvent*)attemptckalloc(sizeof(CommandEvent)); + if (ev == NULL) { + PyErr_NoMemory(); + return NULL; + } ev->ev.proc = (Tcl_EventProc*)Tkapp_CommandProc; ev->interp = self->interp; ev->create = 0; |