Skip to content

Commit a423ddb

Browse files
[3.12] gh-86493: Fix possible leaks in some modules initialization (GH-106768) (GH-106855)
Fix _ssl, _stat, _testinternalcapi, _threadmodule, cmath, math, posix, time. (cherry picked from commit 3e65bae)
1 parent b79f3b3 commit a423ddb

File tree

10 files changed

+46
-62
lines changed

10 files changed

+46
-62
lines changed

Include/cpython/modsupport.h

+1
Original file line numberDiff line numberDiff line change
@@ -106,3 +106,4 @@ PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywordsWithVararg(
106106
(minpos), (maxpos), (minkw), (buf)))
107107

108108
PyAPI_FUNC(PyObject *) _PyModule_CreateInitialized(PyModuleDef*, int apiver);
109+
PyAPI_FUNC(int) _PyModule_Add(PyObject *, const char *, PyObject *);

Modules/_ssl.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -6095,22 +6095,22 @@ sslmodule_init_versioninfo(PyObject *m)
60956095
*/
60966096
libver = OpenSSL_version_num();
60976097
r = PyLong_FromUnsignedLong(libver);
6098-
if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
6098+
if (_PyModule_Add(m, "OPENSSL_VERSION_NUMBER", r) < 0)
60996099
return -1;
61006100

61016101
parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
61026102
r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
6103-
if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
6103+
if (_PyModule_Add(m, "OPENSSL_VERSION_INFO", r) < 0)
61046104
return -1;
61056105

61066106
r = PyUnicode_FromString(OpenSSL_version(OPENSSL_VERSION));
6107-
if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
6107+
if (_PyModule_Add(m, "OPENSSL_VERSION", r) < 0)
61086108
return -1;
61096109

61106110
libver = OPENSSL_VERSION_NUMBER;
61116111
parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
61126112
r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
6113-
if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
6113+
if (_PyModule_Add(m, "_OPENSSL_API_VERSION", r) < 0)
61146114
return -1;
61156115

61166116
return 0;

Modules/_stat.c

+9-9
Original file line numberDiff line numberDiff line change
@@ -592,17 +592,17 @@ stat_exec(PyObject *module)
592592
ADD_INT_MACRO(module, FILE_ATTRIBUTE_TEMPORARY);
593593
ADD_INT_MACRO(module, FILE_ATTRIBUTE_VIRTUAL);
594594

595-
if (PyModule_AddObject(module, "IO_REPARSE_TAG_SYMLINK",
596-
PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK)) < 0) {
597-
return -1;
595+
if (_PyModule_Add(module, "IO_REPARSE_TAG_SYMLINK",
596+
PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK)) < 0) {
597+
return -1;
598598
}
599-
if (PyModule_AddObject(module, "IO_REPARSE_TAG_MOUNT_POINT",
600-
PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT)) < 0) {
601-
return -1;
599+
if (_PyModule_Add(module, "IO_REPARSE_TAG_MOUNT_POINT",
600+
PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT)) < 0) {
601+
return -1;
602602
}
603-
if (PyModule_AddObject(module, "IO_REPARSE_TAG_APPEXECLINK",
604-
PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK)) < 0) {
605-
return -1;
603+
if (_PyModule_Add(module, "IO_REPARSE_TAG_APPEXECLINK",
604+
PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK)) < 0) {
605+
return -1;
606606
}
607607
#endif
608608

Modules/_testinternalcapi.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1092,8 +1092,8 @@ static PyMethodDef module_functions[] = {
10921092
static int
10931093
module_exec(PyObject *module)
10941094
{
1095-
if (PyModule_AddObject(module, "SIZEOF_PYGC_HEAD",
1096-
PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) {
1095+
if (_PyModule_Add(module, "SIZEOF_PYGC_HEAD",
1096+
PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) {
10971097
return 1;
10981098
}
10991099

Modules/_threadmodule.c

+2-2
Original file line numberDiff line numberDiff line change
@@ -1671,8 +1671,8 @@ thread_module_exec(PyObject *module)
16711671
// Round towards minus infinity
16721672
timeout_max = floor(timeout_max);
16731673

1674-
if (PyModule_AddObject(module, "TIMEOUT_MAX",
1675-
PyFloat_FromDouble(timeout_max)) < 0) {
1674+
if (_PyModule_Add(module, "TIMEOUT_MAX",
1675+
PyFloat_FromDouble(timeout_max)) < 0) {
16761676
return -1;
16771677
}
16781678

Modules/cmathmodule.c

+7-8
Original file line numberDiff line numberDiff line change
@@ -1216,30 +1216,29 @@ static PyMethodDef cmath_methods[] = {
12161216
static int
12171217
cmath_exec(PyObject *mod)
12181218
{
1219-
if (PyModule_AddObject(mod, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
1219+
if (_PyModule_Add(mod, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
12201220
return -1;
12211221
}
1222-
if (PyModule_AddObject(mod, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
1222+
if (_PyModule_Add(mod, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
12231223
return -1;
12241224
}
12251225
// 2pi
1226-
if (PyModule_AddObject(mod, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
1226+
if (_PyModule_Add(mod, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
12271227
return -1;
12281228
}
1229-
if (PyModule_AddObject(mod, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
1229+
if (_PyModule_Add(mod, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
12301230
return -1;
12311231
}
12321232

12331233
Py_complex infj = {0.0, Py_INFINITY};
1234-
if (PyModule_AddObject(mod, "infj",
1235-
PyComplex_FromCComplex(infj)) < 0) {
1234+
if (_PyModule_Add(mod, "infj", PyComplex_FromCComplex(infj)) < 0) {
12361235
return -1;
12371236
}
1238-
if (PyModule_AddObject(mod, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
1237+
if (_PyModule_Add(mod, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
12391238
return -1;
12401239
}
12411240
Py_complex nanj = {0.0, fabs(Py_NAN)};
1242-
if (PyModule_AddObject(mod, "nanj", PyComplex_FromCComplex(nanj)) < 0) {
1241+
if (_PyModule_Add(mod, "nanj", PyComplex_FromCComplex(nanj)) < 0) {
12431242
return -1;
12441243
}
12451244

Modules/mathmodule.c

+5-5
Original file line numberDiff line numberDiff line change
@@ -4037,20 +4037,20 @@ math_exec(PyObject *module)
40374037
if (state->str___trunc__ == NULL) {
40384038
return -1;
40394039
}
4040-
if (PyModule_AddObject(module, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
4040+
if (_PyModule_Add(module, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
40414041
return -1;
40424042
}
4043-
if (PyModule_AddObject(module, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
4043+
if (_PyModule_Add(module, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
40444044
return -1;
40454045
}
40464046
// 2pi
4047-
if (PyModule_AddObject(module, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
4047+
if (_PyModule_Add(module, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
40484048
return -1;
40494049
}
4050-
if (PyModule_AddObject(module, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
4050+
if (_PyModule_Add(module, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
40514051
return -1;
40524052
}
4053-
if (PyModule_AddObject(module, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
4053+
if (_PyModule_Add(module, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
40544054
return -1;
40554055
}
40564056
return 0;

Modules/posixmodule.c

+4-8
Original file line numberDiff line numberDiff line change
@@ -13463,7 +13463,7 @@ setup_confname_table(struct constdef *table, size_t tablesize,
1346313463
}
1346413464
Py_DECREF(o);
1346513465
}
13466-
return PyModule_AddObject(module, tablename, d);
13466+
return _PyModule_Add(module, tablename, d);
1346713467
}
1346813468

1346913469
/* Return -1 on failure, 0 on success. */
@@ -16778,11 +16778,9 @@ posixmodule_exec(PyObject *m)
1677816778
#endif
1677916779

1678016780
/* Initialize environ dictionary */
16781-
PyObject *v = convertenviron();
16782-
Py_XINCREF(v);
16783-
if (v == NULL || PyModule_AddObject(m, "environ", v) != 0)
16781+
if (_PyModule_Add(m, "environ", convertenviron()) != 0) {
1678416782
return -1;
16785-
Py_DECREF(v);
16783+
}
1678616784

1678716785
if (all_ins(m))
1678816786
return -1;
@@ -16897,9 +16895,7 @@ posixmodule_exec(PyObject *m)
1689716895
Py_DECREF(unicode);
1689816896
}
1689916897

16900-
PyModule_AddObject(m, "_have_functions", list);
16901-
16902-
return 0;
16898+
return _PyModule_Add(m, "_have_functions", list);
1690316899
}
1690416900

1690516901

Modules/timemodule.c

+2-5
Original file line numberDiff line numberDiff line change
@@ -1790,11 +1790,9 @@ init_timezone(PyObject *m)
17901790
return -1;
17911791
}
17921792
#endif // MS_WINDOWS
1793-
PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1);
1794-
if (tzname_obj == NULL) {
1793+
if (_PyModule_Add(m, "tzname", Py_BuildValue("(NN)", otz0, otz1)) < 0) {
17951794
return -1;
17961795
}
1797-
PyModule_AddObject(m, "tzname", tzname_obj);
17981796
#else // !HAVE_DECL_TZNAME
17991797
static const time_t YEAR = (365 * 24 + 6) * 3600;
18001798
time_t t;
@@ -1837,10 +1835,9 @@ init_timezone(PyObject *m)
18371835
PyModule_AddIntConstant(m, "daylight", janzone != julyzone);
18381836
tzname_obj = Py_BuildValue("(zz)", janname, julyname);
18391837
}
1840-
if (tzname_obj == NULL) {
1838+
if (_PyModule_Add(m, "tzname", tzname_obj) < 0) {
18411839
return -1;
18421840
}
1843-
PyModule_AddObject(m, "tzname", tzname_obj);
18441841
#endif // !HAVE_DECL_TZNAME
18451842

18461843
if (PyErr_Occurred()) {

Python/modsupport.c

+10-19
Original file line numberDiff line numberDiff line change
@@ -649,13 +649,16 @@ PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value)
649649
PyModule_GetName(mod));
650650
return -1;
651651
}
652-
653-
if (PyDict_SetItemString(dict, name, value)) {
654-
return -1;
655-
}
656-
return 0;
652+
return PyDict_SetItemString(dict, name, value);
657653
}
658654

655+
int
656+
_PyModule_Add(PyObject *mod, const char *name, PyObject *value)
657+
{
658+
int res = PyModule_AddObjectRef(mod, name, value);
659+
Py_XDECREF(value);
660+
return res;
661+
}
659662

660663
int
661664
PyModule_AddObject(PyObject *mod, const char *name, PyObject *value)
@@ -670,25 +673,13 @@ PyModule_AddObject(PyObject *mod, const char *name, PyObject *value)
670673
int
671674
PyModule_AddIntConstant(PyObject *m, const char *name, long value)
672675
{
673-
PyObject *obj = PyLong_FromLong(value);
674-
if (!obj) {
675-
return -1;
676-
}
677-
int res = PyModule_AddObjectRef(m, name, obj);
678-
Py_DECREF(obj);
679-
return res;
676+
return _PyModule_Add(m, name, PyLong_FromLong(value));
680677
}
681678

682679
int
683680
PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
684681
{
685-
PyObject *obj = PyUnicode_FromString(value);
686-
if (!obj) {
687-
return -1;
688-
}
689-
int res = PyModule_AddObjectRef(m, name, obj);
690-
Py_DECREF(obj);
691-
return res;
682+
return _PyModule_Add(m, name, PyUnicode_FromString(value));
692683
}
693684

694685
int

0 commit comments

Comments
 (0)