Skip to content

Commit 00d7abd

Browse files
authored
bpo-42519: Replace PyMem_MALLOC() with PyMem_Malloc() (GH-23586)
No longer use deprecated aliases to functions: * Replace PyMem_MALLOC() with PyMem_Malloc() * Replace PyMem_REALLOC() with PyMem_Realloc() * Replace PyMem_FREE() with PyMem_Free() * Replace PyMem_Del() with PyMem_Free() * Replace PyMem_DEL() with PyMem_Free() Modify also the PyMem_DEL() macro to use directly PyMem_Free().
1 parent b2d0c66 commit 00d7abd

33 files changed

+175
-188
lines changed

Include/objimpl.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ PyAPI_FUNC(void *) PyObject_Realloc(void *ptr, size_t new_size);
102102
PyAPI_FUNC(void) PyObject_Free(void *ptr);
103103

104104

105-
/* Macros */
105+
// Deprecated aliases only kept for backward compatibility.
106106
#define PyObject_MALLOC PyObject_Malloc
107107
#define PyObject_REALLOC PyObject_Realloc
108108
#define PyObject_FREE PyObject_Free
@@ -138,8 +138,8 @@ PyAPI_FUNC(PyVarObject *) _PyObject_NewVar(PyTypeObject *, Py_ssize_t);
138138
#define PyObject_NewVar(type, typeobj, n) \
139139
( (type *) _PyObject_NewVar((typeobj), (n)) )
140140

141-
// Alias to PyObject_New(). In Python 3.8, PyObject_NEW() called directly
142-
// PyObject_MALLOC() with _PyObject_VAR_SIZE().
141+
// Alias to PyObject_NewVar(). In Python 3.8, PyObject_NEW_VAR() called
142+
// directly PyObject_MALLOC() with _PyObject_VAR_SIZE().
143143
#define PyObject_NEW_VAR(type, typeobj, n) PyObject_NewVar(type, typeobj, n)
144144

145145

Include/pymem.h

Lines changed: 9 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -53,18 +53,6 @@ PyAPI_FUNC(void *) PyMem_Malloc(size_t size);
5353
PyAPI_FUNC(void *) PyMem_Realloc(void *ptr, size_t new_size);
5454
PyAPI_FUNC(void) PyMem_Free(void *ptr);
5555

56-
/* Macros. */
57-
58-
/* PyMem_MALLOC(0) means malloc(1). Some systems would return NULL
59-
for malloc(0), which would be treated as an error. Some platforms
60-
would return a pointer with no memory behind it, which would break
61-
pymalloc. To solve these problems, allocate an extra byte. */
62-
/* Returns NULL to indicate error if a negative size or size larger than
63-
Py_ssize_t can represent is supplied. Helps prevents security holes. */
64-
#define PyMem_MALLOC(n) PyMem_Malloc(n)
65-
#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n)
66-
#define PyMem_FREE(p) PyMem_Free(p)
67-
6856
/*
6957
* Type-oriented memory interface
7058
* ==============================
@@ -78,9 +66,6 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr);
7866
#define PyMem_New(type, n) \
7967
( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \
8068
( (type *) PyMem_Malloc((n) * sizeof(type)) ) )
81-
#define PyMem_NEW(type, n) \
82-
( ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \
83-
( (type *) PyMem_MALLOC((n) * sizeof(type)) ) )
8469

8570
/*
8671
* The value of (p) is always clobbered by this macro regardless of success.
@@ -91,15 +76,16 @@ PyAPI_FUNC(void) PyMem_Free(void *ptr);
9176
#define PyMem_Resize(p, type, n) \
9277
( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \
9378
(type *) PyMem_Realloc((p), (n) * sizeof(type)) )
94-
#define PyMem_RESIZE(p, type, n) \
95-
( (p) = ((size_t)(n) > PY_SSIZE_T_MAX / sizeof(type)) ? NULL : \
96-
(type *) PyMem_REALLOC((p), (n) * sizeof(type)) )
9779

98-
/* PyMem{Del,DEL} are left over from ancient days, and shouldn't be used
99-
* anymore. They're just confusing aliases for PyMem_{Free,FREE} now.
100-
*/
101-
#define PyMem_Del PyMem_Free
102-
#define PyMem_DEL PyMem_FREE
80+
81+
// Deprecated aliases only kept for backward compatibility.
82+
#define PyMem_MALLOC(n) PyMem_Malloc(n)
83+
#define PyMem_NEW(type, n) PyMem_New(type, n)
84+
#define PyMem_REALLOC(p, n) PyMem_Realloc(p, n)
85+
#define PyMem_RESIZE(p, type, n) PyMem_Resize(p, type, n)
86+
#define PyMem_FREE(p) PyMem_Free(p)
87+
#define PyMem_Del(p) PyMem_Free(p)
88+
#define PyMem_DEL(p) PyMem_Free(p)
10389

10490

10591
#ifndef Py_LIMITED_API

Modules/_localemodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,8 +370,8 @@ _locale_strcoll_impl(PyObject *module, PyObject *os1, PyObject *os2)
370370
result = PyLong_FromLong(wcscoll(ws1, ws2));
371371
done:
372372
/* Deallocate everything. */
373-
if (ws1) PyMem_FREE(ws1);
374-
if (ws2) PyMem_FREE(ws2);
373+
if (ws1) PyMem_Free(ws1);
374+
if (ws2) PyMem_Free(ws2);
375375
return result;
376376
}
377377
#endif

Modules/_pickle.c

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ Pdata_dealloc(Pdata *self)
442442
while (--i >= 0) {
443443
Py_DECREF(self->data[i]);
444444
}
445-
PyMem_FREE(self->data);
445+
PyMem_Free(self->data);
446446
PyObject_Del(self);
447447
}
448448

@@ -465,7 +465,7 @@ Pdata_New(void)
465465
self->mark_set = 0;
466466
self->fence = 0;
467467
self->allocated = 8;
468-
self->data = PyMem_MALLOC(self->allocated * sizeof(PyObject *));
468+
self->data = PyMem_Malloc(self->allocated * sizeof(PyObject *));
469469
if (self->data)
470470
return (PyObject *)self;
471471
Py_DECREF(self);
@@ -726,7 +726,7 @@ static PyTypeObject Unpickler_Type;
726726
static PyMemoTable *
727727
PyMemoTable_New(void)
728728
{
729-
PyMemoTable *memo = PyMem_MALLOC(sizeof(PyMemoTable));
729+
PyMemoTable *memo = PyMem_Malloc(sizeof(PyMemoTable));
730730
if (memo == NULL) {
731731
PyErr_NoMemory();
732732
return NULL;
@@ -735,9 +735,9 @@ PyMemoTable_New(void)
735735
memo->mt_used = 0;
736736
memo->mt_allocated = MT_MINSIZE;
737737
memo->mt_mask = MT_MINSIZE - 1;
738-
memo->mt_table = PyMem_MALLOC(MT_MINSIZE * sizeof(PyMemoEntry));
738+
memo->mt_table = PyMem_Malloc(MT_MINSIZE * sizeof(PyMemoEntry));
739739
if (memo->mt_table == NULL) {
740-
PyMem_FREE(memo);
740+
PyMem_Free(memo);
741741
PyErr_NoMemory();
742742
return NULL;
743743
}
@@ -758,10 +758,10 @@ PyMemoTable_Copy(PyMemoTable *self)
758758
new->mt_mask = self->mt_mask;
759759
/* The table we get from _New() is probably smaller than we wanted.
760760
Free it and allocate one that's the right size. */
761-
PyMem_FREE(new->mt_table);
761+
PyMem_Free(new->mt_table);
762762
new->mt_table = PyMem_NEW(PyMemoEntry, self->mt_allocated);
763763
if (new->mt_table == NULL) {
764-
PyMem_FREE(new);
764+
PyMem_Free(new);
765765
PyErr_NoMemory();
766766
return NULL;
767767
}
@@ -800,8 +800,8 @@ PyMemoTable_Del(PyMemoTable *self)
800800
return;
801801
PyMemoTable_Clear(self);
802802

803-
PyMem_FREE(self->mt_table);
804-
PyMem_FREE(self);
803+
PyMem_Free(self->mt_table);
804+
PyMem_Free(self);
805805
}
806806

807807
/* Since entries cannot be deleted from this hashtable, _PyMemoTable_Lookup()
@@ -880,7 +880,7 @@ _PyMemoTable_ResizeTable(PyMemoTable *self, size_t min_size)
880880
}
881881

882882
/* Deallocate the old table. */
883-
PyMem_FREE(oldtable);
883+
PyMem_Free(oldtable);
884884
return 0;
885885
}
886886

@@ -1582,7 +1582,7 @@ _Unpickler_MemoCleanup(UnpicklerObject *self)
15821582
while (--i >= 0) {
15831583
Py_XDECREF(memo[i]);
15841584
}
1585-
PyMem_FREE(memo);
1585+
PyMem_Free(memo);
15861586
}
15871587

15881588
static UnpicklerObject *
@@ -7544,7 +7544,7 @@ Unpickler_set_memo(UnpicklerObject *self, PyObject *obj, void *Py_UNUSED(ignored
75447544
for (size_t i = new_memo_size - 1; i != SIZE_MAX; i--) {
75457545
Py_XDECREF(new_memo[i]);
75467546
}
7547-
PyMem_FREE(new_memo);
7547+
PyMem_Free(new_memo);
75487548
}
75497549
return -1;
75507550
}

Modules/_sre.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ static void
197197
data_stack_dealloc(SRE_STATE* state)
198198
{
199199
if (state->data_stack) {
200-
PyMem_FREE(state->data_stack);
200+
PyMem_Free(state->data_stack);
201201
state->data_stack = NULL;
202202
}
203203
state->data_stack_size = state->data_stack_base = 0;
@@ -213,7 +213,7 @@ data_stack_grow(SRE_STATE* state, Py_ssize_t size)
213213
void* stack;
214214
cursize = minsize+minsize/4+1024;
215215
TRACE(("allocate/grow stack %zd\n", cursize));
216-
stack = PyMem_REALLOC(state->data_stack, cursize);
216+
stack = PyMem_Realloc(state->data_stack, cursize);
217217
if (!stack) {
218218
data_stack_dealloc(state);
219219
return SRE_ERROR_MEMORY;
@@ -472,7 +472,7 @@ state_init(SRE_STATE* state, PatternObject* pattern, PyObject* string,
472472
/* We add an explicit cast here because MSVC has a bug when
473473
compiling C code where it believes that `const void**` cannot be
474474
safely casted to `void*`, see bpo-39943 for details. */
475-
PyMem_Del((void*) state->mark);
475+
PyMem_Free((void*) state->mark);
476476
state->mark = NULL;
477477
if (state->buffer.buf)
478478
PyBuffer_Release(&state->buffer);
@@ -487,7 +487,7 @@ state_fini(SRE_STATE* state)
487487
Py_XDECREF(state->string);
488488
data_stack_dealloc(state);
489489
/* See above PyMem_Del for why we explicitly cast here. */
490-
PyMem_Del((void*) state->mark);
490+
PyMem_Free((void*) state->mark);
491491
state->mark = NULL;
492492
}
493493

Modules/_ssl.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3306,10 +3306,10 @@ context_dealloc(PySSLContext *self)
33063306
context_clear(self);
33073307
SSL_CTX_free(self->ctx);
33083308
#if HAVE_NPN
3309-
PyMem_FREE(self->npn_protocols);
3309+
PyMem_Free(self->npn_protocols);
33103310
#endif
33113311
#if HAVE_ALPN
3312-
PyMem_FREE(self->alpn_protocols);
3312+
PyMem_Free(self->alpn_protocols);
33133313
#endif
33143314
Py_TYPE(self)->tp_free(self);
33153315
Py_DECREF(tp);
@@ -3510,7 +3510,7 @@ _ssl__SSLContext__set_alpn_protocols_impl(PySSLContext *self,
35103510
return NULL;
35113511
}
35123512

3513-
PyMem_FREE(self->alpn_protocols);
3513+
PyMem_Free(self->alpn_protocols);
35143514
self->alpn_protocols = PyMem_Malloc(protos->len);
35153515
if (!self->alpn_protocols)
35163516
return PyErr_NoMemory();

Modules/_struct.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1373,14 +1373,14 @@ prepare_s(PyStructObject *self)
13731373

13741374
self->s_size = size;
13751375
self->s_len = len;
1376-
codes = PyMem_MALLOC((ncodes + 1) * sizeof(formatcode));
1376+
codes = PyMem_Malloc((ncodes + 1) * sizeof(formatcode));
13771377
if (codes == NULL) {
13781378
PyErr_NoMemory();
13791379
return -1;
13801380
}
13811381
/* Free any s_codes value left over from a previous initialization. */
13821382
if (self->s_codes != NULL)
1383-
PyMem_FREE(self->s_codes);
1383+
PyMem_Free(self->s_codes);
13841384
self->s_codes = codes;
13851385

13861386
s = fmt;
@@ -1502,7 +1502,7 @@ s_dealloc(PyStructObject *s)
15021502
if (s->weakreflist != NULL)
15031503
PyObject_ClearWeakRefs((PyObject *)s);
15041504
if (s->s_codes != NULL) {
1505-
PyMem_FREE(s->s_codes);
1505+
PyMem_Free(s->s_codes);
15061506
}
15071507
Py_XDECREF(s->s_format);
15081508
freefunc free_func = PyType_GetSlot(Py_TYPE(s), Py_tp_free);

Modules/_testcapimodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1988,12 +1988,12 @@ unicode_asucs4(PyObject *self, PyObject *args)
19881988
buffer[str_len] = 0xffffU;
19891989

19901990
if (!PyUnicode_AsUCS4(unicode, buffer, buf_len, copy_null)) {
1991-
PyMem_FREE(buffer);
1991+
PyMem_Free(buffer);
19921992
return NULL;
19931993
}
19941994

19951995
result = PyUnicode_FromKindAndData(PyUnicode_4BYTE_KIND, buffer, buf_len);
1996-
PyMem_FREE(buffer);
1996+
PyMem_Free(buffer);
19971997
return result;
19981998
}
19991999

Modules/_threadmodule.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1056,7 +1056,7 @@ t_bootstrap(void *boot_raw)
10561056
Py_DECREF(boot->func);
10571057
Py_DECREF(boot->args);
10581058
Py_XDECREF(boot->keyw);
1059-
PyMem_DEL(boot_raw);
1059+
PyMem_Free(boot_raw);
10601060
tstate->interp->num_threads--;
10611061
PyThreadState_Clear(tstate);
10621062
_PyThreadState_DeleteCurrent(tstate);
@@ -1107,7 +1107,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
11071107
boot->tstate = _PyThreadState_Prealloc(boot->interp);
11081108
boot->runtime = runtime;
11091109
if (boot->tstate == NULL) {
1110-
PyMem_DEL(boot);
1110+
PyMem_Free(boot);
11111111
return PyErr_NoMemory();
11121112
}
11131113
Py_INCREF(func);
@@ -1121,7 +1121,7 @@ thread_PyThread_start_new_thread(PyObject *self, PyObject *fargs)
11211121
Py_DECREF(args);
11221122
Py_XDECREF(keyw);
11231123
PyThreadState_Clear(boot->tstate);
1124-
PyMem_DEL(boot);
1124+
PyMem_Free(boot);
11251125
return NULL;
11261126
}
11271127
return PyLong_FromUnsignedLong(ident);

Modules/_tkinter.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2472,7 +2472,7 @@ PythonCmdDelete(ClientData clientData)
24722472
ENTER_PYTHON
24732473
Py_XDECREF(data->self);
24742474
Py_XDECREF(data->func);
2475-
PyMem_DEL(data);
2475+
PyMem_Free(data);
24762476
LEAVE_PYTHON
24772477
}
24782478

@@ -2545,7 +2545,7 @@ _tkinter_tkapp_createcommand_impl(TkappObject *self, const char *name,
25452545
CommandEvent *ev = (CommandEvent*)attemptckalloc(sizeof(CommandEvent));
25462546
if (ev == NULL) {
25472547
PyErr_NoMemory();
2548-
PyMem_DEL(data);
2548+
PyMem_Free(data);
25492549
return NULL;
25502550
}
25512551
ev->ev.proc = (Tcl_EventProc*)Tkapp_CommandProc;
@@ -2568,7 +2568,7 @@ _tkinter_tkapp_createcommand_impl(TkappObject *self, const char *name,
25682568
}
25692569
if (err) {
25702570
PyErr_SetString(Tkinter_TclError, "can't create Tcl command");
2571-
PyMem_DEL(data);
2571+
PyMem_Free(data);
25722572
return NULL;
25732573
}
25742574

@@ -2666,7 +2666,7 @@ DeleteFHCD(int id)
26662666
*pp = p->next;
26672667
Py_XDECREF(p->func);
26682668
Py_XDECREF(p->file);
2669-
PyMem_DEL(p);
2669+
PyMem_Free(p);
26702670
}
26712671
else
26722672
pp = &p->next;

Modules/arraymodule.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ array_resize(arrayobject *self, Py_ssize_t newsize)
133133
}
134134

135135
if (newsize == 0) {
136-
PyMem_FREE(self->ob_item);
136+
PyMem_Free(self->ob_item);
137137
self->ob_item = NULL;
138138
Py_SET_SIZE(self, 0);
139139
self->allocated = 0;
@@ -652,7 +652,7 @@ array_dealloc(arrayobject *op)
652652
if (op->weakreflist != NULL)
653653
PyObject_ClearWeakRefs((PyObject *) op);
654654
if (op->ob_item != NULL)
655-
PyMem_DEL(op->ob_item);
655+
PyMem_Free(op->ob_item);
656656
Py_TYPE(op)->tp_free((PyObject *)op);
657657
}
658658

Modules/cjkcodecs/multibytecodec.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1191,13 +1191,13 @@ _multibytecodec_MultibyteIncrementalDecoder_decode_impl(MultibyteIncrementalDeco
11911191
goto errorexit;
11921192

11931193
if (wdata != data)
1194-
PyMem_Del(wdata);
1194+
PyMem_Free(wdata);
11951195
Py_XDECREF(buf.excobj);
11961196
return res;
11971197

11981198
errorexit:
11991199
if (wdata != NULL && wdata != data)
1200-
PyMem_Del(wdata);
1200+
PyMem_Free(wdata);
12011201
Py_XDECREF(buf.excobj);
12021202
_PyUnicodeWriter_Dealloc(&buf.writer);
12031203
return NULL;

0 commit comments

Comments
 (0)