Commit ee6c3c71 authored by Victor Stinner's avatar Victor Stinner

Closes #22336: attemptckalloc() with PyMem_Malloc() in _tkinter

The PyMem_Malloc(size) function has a well defined behaviour: if size is 0, a
pointer different than NULL is returned. PyMem_Malloc() allocations are
tracked by tracemalloc, attemptckalloc() allocations are not tracked.
parent a1b16bab
...@@ -605,7 +605,7 @@ Tkapp_New(const char *screenName, const char *className, ...@@ -605,7 +605,7 @@ Tkapp_New(const char *screenName, const char *className,
Tcl_SetVar(v->interp, "tcl_interactive", "0", TCL_GLOBAL_ONLY); Tcl_SetVar(v->interp, "tcl_interactive", "0", TCL_GLOBAL_ONLY);
/* This is used to get the application class for Tk 4.1 and up */ /* This is used to get the application class for Tk 4.1 and up */
argv0 = (char*)attemptckalloc(strlen(className) + 1); argv0 = (char*)PyMem_Malloc(strlen(className) + 1);
if (!argv0) { if (!argv0) {
PyErr_NoMemory(); PyErr_NoMemory();
Py_DECREF(v); Py_DECREF(v);
...@@ -616,7 +616,7 @@ Tkapp_New(const char *screenName, const char *className, ...@@ -616,7 +616,7 @@ Tkapp_New(const char *screenName, const char *className,
if (Py_ISUPPER(Py_CHARMASK(argv0[0]))) if (Py_ISUPPER(Py_CHARMASK(argv0[0])))
argv0[0] = Py_TOLOWER(Py_CHARMASK(argv0[0])); argv0[0] = Py_TOLOWER(Py_CHARMASK(argv0[0]));
Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY); Tcl_SetVar(v->interp, "argv0", argv0, TCL_GLOBAL_ONLY);
ckfree(argv0); PyMem_Free(argv0);
if (! wantTk) { if (! wantTk) {
Tcl_SetVar(v->interp, Tcl_SetVar(v->interp,
...@@ -639,7 +639,7 @@ Tkapp_New(const char *screenName, const char *className, ...@@ -639,7 +639,7 @@ Tkapp_New(const char *screenName, const char *className,
if (use) if (use)
len += strlen(use) + sizeof "-use "; len += strlen(use) + sizeof "-use ";
args = (char*)attemptckalloc(len); args = (char*)PyMem_Malloc(len);
if (!args) { if (!args) {
PyErr_NoMemory(); PyErr_NoMemory();
Py_DECREF(v); Py_DECREF(v);
...@@ -657,7 +657,7 @@ Tkapp_New(const char *screenName, const char *className, ...@@ -657,7 +657,7 @@ Tkapp_New(const char *screenName, const char *className,
} }
Tcl_SetVar(v->interp, "argv", args, TCL_GLOBAL_ONLY); Tcl_SetVar(v->interp, "argv", args, TCL_GLOBAL_ONLY);
ckfree(args); PyMem_Free(args);
} }
if (Tcl_AppInit(v->interp) != TCL_OK) { if (Tcl_AppInit(v->interp) != TCL_OK) {
...@@ -914,15 +914,15 @@ AsObj(PyObject *value) ...@@ -914,15 +914,15 @@ AsObj(PyObject *value)
"list is too long"); "list is too long");
return NULL; return NULL;
} }
argv = (Tcl_Obj **) attemptckalloc(((size_t)size) * sizeof(Tcl_Obj *)); argv = (Tcl_Obj **) PyMem_Malloc(((size_t)size) * sizeof(Tcl_Obj *));
if(!argv) { if (!argv) {
PyErr_NoMemory(); PyErr_NoMemory();
return NULL; return NULL;
} }
for (i = 0; i < size; i++) for (i = 0; i < size; i++)
argv[i] = AsObj(PySequence_Fast_GET_ITEM(value,i)); argv[i] = AsObj(PySequence_Fast_GET_ITEM(value,i));
result = Tcl_NewListObj(size, argv); result = Tcl_NewListObj(size, argv);
ckfree(FREECAST argv); PyMem_Free(argv);
return result; return result;
} }
else if (PyUnicode_Check(value)) { else if (PyUnicode_Check(value)) {
...@@ -948,7 +948,7 @@ AsObj(PyObject *value) ...@@ -948,7 +948,7 @@ AsObj(PyObject *value)
if (kind == sizeof(Tcl_UniChar)) if (kind == sizeof(Tcl_UniChar))
return Tcl_NewUnicodeObj(inbuf, size); return Tcl_NewUnicodeObj(inbuf, size);
allocsize = ((size_t)size) * sizeof(Tcl_UniChar); allocsize = ((size_t)size) * sizeof(Tcl_UniChar);
outbuf = (Tcl_UniChar*)attemptckalloc(allocsize); outbuf = (Tcl_UniChar*)PyMem_Malloc(allocsize);
/* Else overflow occurred, and we take the next exit */ /* Else overflow occurred, and we take the next exit */
if (!outbuf) { if (!outbuf) {
PyErr_NoMemory(); PyErr_NoMemory();
...@@ -965,14 +965,14 @@ AsObj(PyObject *value) ...@@ -965,14 +965,14 @@ AsObj(PyObject *value)
"character U+%x is above the range " "character U+%x is above the range "
"(U+0000-U+FFFF) allowed by Tcl", "(U+0000-U+FFFF) allowed by Tcl",
ch); ch);
ckfree(FREECAST outbuf); PyMem_Free(outbuf);
return NULL; return NULL;
} }
#endif #endif
outbuf[i] = ch; outbuf[i] = ch;
} }
result = Tcl_NewUnicodeObj(outbuf, size); result = Tcl_NewUnicodeObj(outbuf, size);
ckfree(FREECAST outbuf); PyMem_Free(outbuf);
return result; return result;
} }
else if(PyTclObject_Check(value)) { else if(PyTclObject_Check(value)) {
...@@ -1084,7 +1084,7 @@ Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc) ...@@ -1084,7 +1084,7 @@ Tkapp_CallDeallocArgs(Tcl_Obj** objv, Tcl_Obj** objStore, int objc)
for (i = 0; i < objc; i++) for (i = 0; i < objc; i++)
Tcl_DecrRefCount(objv[i]); Tcl_DecrRefCount(objv[i]);
if (objv != objStore) if (objv != objStore)
ckfree(FREECAST objv); PyMem_Free(objv);
} }
/* Convert Python objects to Tcl objects. This must happen in the /* Convert Python objects to Tcl objects. This must happen in the
...@@ -1115,7 +1115,7 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc) ...@@ -1115,7 +1115,7 @@ Tkapp_CallArgs(PyObject *args, Tcl_Obj** objStore, int *pobjc)
"list is too long"); "list is too long");
return NULL; return NULL;
} }
objv = (Tcl_Obj **)attemptckalloc(((size_t)objc) * sizeof(Tcl_Obj *)); objv = (Tcl_Obj **)PyMem_Malloc(((size_t)objc) * sizeof(Tcl_Obj *));
if (objv == NULL) { if (objv == NULL) {
PyErr_NoMemory(); PyErr_NoMemory();
objc = 0; objc = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment