summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2023-07-18 12:14:10 (GMT)
committerGitHub <noreply@github.com>2023-07-18 12:14:10 (GMT)
commita423ddbdeada8a2fd8657453b9e9f58ba0dd921d (patch)
tree92bf9ec6a80c41499f73a2d2e599df685ab8c4de
parentb79f3b36c318be8b27d1737a819e33145193801c (diff)
downloadcpython-a423ddbdeada8a2fd8657453b9e9f58ba0dd921d.zip
cpython-a423ddbdeada8a2fd8657453b9e9f58ba0dd921d.tar.gz
cpython-a423ddbdeada8a2fd8657453b9e9f58ba0dd921d.tar.bz2
[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 3e65baee72131b49f4ce8ca2da568a6f2001ce93)
-rw-r--r--Include/cpython/modsupport.h1
-rw-r--r--Modules/_ssl.c8
-rw-r--r--Modules/_stat.c18
-rw-r--r--Modules/_testinternalcapi.c4
-rw-r--r--Modules/_threadmodule.c4
-rw-r--r--Modules/cmathmodule.c15
-rw-r--r--Modules/mathmodule.c10
-rw-r--r--Modules/posixmodule.c12
-rw-r--r--Modules/timemodule.c7
-rw-r--r--Python/modsupport.c29
10 files changed, 46 insertions, 62 deletions
diff --git a/Include/cpython/modsupport.h b/Include/cpython/modsupport.h
index 88f34fe..2259291 100644
--- a/Include/cpython/modsupport.h
+++ b/Include/cpython/modsupport.h
@@ -106,3 +106,4 @@ PyAPI_FUNC(PyObject * const *) _PyArg_UnpackKeywordsWithVararg(
(minpos), (maxpos), (minkw), (buf)))
PyAPI_FUNC(PyObject *) _PyModule_CreateInitialized(PyModuleDef*, int apiver);
+PyAPI_FUNC(int) _PyModule_Add(PyObject *, const char *, PyObject *);
diff --git a/Modules/_ssl.c b/Modules/_ssl.c
index a3fb12e..619b4f4 100644
--- a/Modules/_ssl.c
+++ b/Modules/_ssl.c
@@ -6095,22 +6095,22 @@ sslmodule_init_versioninfo(PyObject *m)
*/
libver = OpenSSL_version_num();
r = PyLong_FromUnsignedLong(libver);
- if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_NUMBER", r))
+ if (_PyModule_Add(m, "OPENSSL_VERSION_NUMBER", r) < 0)
return -1;
parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
- if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION_INFO", r))
+ if (_PyModule_Add(m, "OPENSSL_VERSION_INFO", r) < 0)
return -1;
r = PyUnicode_FromString(OpenSSL_version(OPENSSL_VERSION));
- if (r == NULL || PyModule_AddObject(m, "OPENSSL_VERSION", r))
+ if (_PyModule_Add(m, "OPENSSL_VERSION", r) < 0)
return -1;
libver = OPENSSL_VERSION_NUMBER;
parse_openssl_version(libver, &major, &minor, &fix, &patch, &status);
r = Py_BuildValue("IIIII", major, minor, fix, patch, status);
- if (r == NULL || PyModule_AddObject(m, "_OPENSSL_API_VERSION", r))
+ if (_PyModule_Add(m, "_OPENSSL_API_VERSION", r) < 0)
return -1;
return 0;
diff --git a/Modules/_stat.c b/Modules/_stat.c
index 4218799..4ec2bd2 100644
--- a/Modules/_stat.c
+++ b/Modules/_stat.c
@@ -592,17 +592,17 @@ stat_exec(PyObject *module)
ADD_INT_MACRO(module, FILE_ATTRIBUTE_TEMPORARY);
ADD_INT_MACRO(module, FILE_ATTRIBUTE_VIRTUAL);
- if (PyModule_AddObject(module, "IO_REPARSE_TAG_SYMLINK",
- PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK)) < 0) {
- return -1;
+ if (_PyModule_Add(module, "IO_REPARSE_TAG_SYMLINK",
+ PyLong_FromUnsignedLong(IO_REPARSE_TAG_SYMLINK)) < 0) {
+ return -1;
}
- if (PyModule_AddObject(module, "IO_REPARSE_TAG_MOUNT_POINT",
- PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT)) < 0) {
- return -1;
+ if (_PyModule_Add(module, "IO_REPARSE_TAG_MOUNT_POINT",
+ PyLong_FromUnsignedLong(IO_REPARSE_TAG_MOUNT_POINT)) < 0) {
+ return -1;
}
- if (PyModule_AddObject(module, "IO_REPARSE_TAG_APPEXECLINK",
- PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK)) < 0) {
- return -1;
+ if (_PyModule_Add(module, "IO_REPARSE_TAG_APPEXECLINK",
+ PyLong_FromUnsignedLong(IO_REPARSE_TAG_APPEXECLINK)) < 0) {
+ return -1;
}
#endif
diff --git a/Modules/_testinternalcapi.c b/Modules/_testinternalcapi.c
index 98f99e4..6fc31f6 100644
--- a/Modules/_testinternalcapi.c
+++ b/Modules/_testinternalcapi.c
@@ -1092,8 +1092,8 @@ static PyMethodDef module_functions[] = {
static int
module_exec(PyObject *module)
{
- if (PyModule_AddObject(module, "SIZEOF_PYGC_HEAD",
- PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) {
+ if (_PyModule_Add(module, "SIZEOF_PYGC_HEAD",
+ PyLong_FromSsize_t(sizeof(PyGC_Head))) < 0) {
return 1;
}
diff --git a/Modules/_threadmodule.c b/Modules/_threadmodule.c
index c553d03..04f4400 100644
--- a/Modules/_threadmodule.c
+++ b/Modules/_threadmodule.c
@@ -1671,8 +1671,8 @@ thread_module_exec(PyObject *module)
// Round towards minus infinity
timeout_max = floor(timeout_max);
- if (PyModule_AddObject(module, "TIMEOUT_MAX",
- PyFloat_FromDouble(timeout_max)) < 0) {
+ if (_PyModule_Add(module, "TIMEOUT_MAX",
+ PyFloat_FromDouble(timeout_max)) < 0) {
return -1;
}
diff --git a/Modules/cmathmodule.c b/Modules/cmathmodule.c
index 1a31bdc..25491e6 100644
--- a/Modules/cmathmodule.c
+++ b/Modules/cmathmodule.c
@@ -1216,30 +1216,29 @@ static PyMethodDef cmath_methods[] = {
static int
cmath_exec(PyObject *mod)
{
- if (PyModule_AddObject(mod, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
+ if (_PyModule_Add(mod, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
return -1;
}
- if (PyModule_AddObject(mod, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
+ if (_PyModule_Add(mod, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
return -1;
}
// 2pi
- if (PyModule_AddObject(mod, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
+ if (_PyModule_Add(mod, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
return -1;
}
- if (PyModule_AddObject(mod, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
+ if (_PyModule_Add(mod, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
return -1;
}
Py_complex infj = {0.0, Py_INFINITY};
- if (PyModule_AddObject(mod, "infj",
- PyComplex_FromCComplex(infj)) < 0) {
+ if (_PyModule_Add(mod, "infj", PyComplex_FromCComplex(infj)) < 0) {
return -1;
}
- if (PyModule_AddObject(mod, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
+ if (_PyModule_Add(mod, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
return -1;
}
Py_complex nanj = {0.0, fabs(Py_NAN)};
- if (PyModule_AddObject(mod, "nanj", PyComplex_FromCComplex(nanj)) < 0) {
+ if (_PyModule_Add(mod, "nanj", PyComplex_FromCComplex(nanj)) < 0) {
return -1;
}
diff --git a/Modules/mathmodule.c b/Modules/mathmodule.c
index f5679fe..7b1104b 100644
--- a/Modules/mathmodule.c
+++ b/Modules/mathmodule.c
@@ -4037,20 +4037,20 @@ math_exec(PyObject *module)
if (state->str___trunc__ == NULL) {
return -1;
}
- if (PyModule_AddObject(module, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
+ if (_PyModule_Add(module, "pi", PyFloat_FromDouble(Py_MATH_PI)) < 0) {
return -1;
}
- if (PyModule_AddObject(module, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
+ if (_PyModule_Add(module, "e", PyFloat_FromDouble(Py_MATH_E)) < 0) {
return -1;
}
// 2pi
- if (PyModule_AddObject(module, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
+ if (_PyModule_Add(module, "tau", PyFloat_FromDouble(Py_MATH_TAU)) < 0) {
return -1;
}
- if (PyModule_AddObject(module, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
+ if (_PyModule_Add(module, "inf", PyFloat_FromDouble(Py_INFINITY)) < 0) {
return -1;
}
- if (PyModule_AddObject(module, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
+ if (_PyModule_Add(module, "nan", PyFloat_FromDouble(fabs(Py_NAN))) < 0) {
return -1;
}
return 0;
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 0f82f1a..fde1e4f 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -13463,7 +13463,7 @@ setup_confname_table(struct constdef *table, size_t tablesize,
}
Py_DECREF(o);
}
- return PyModule_AddObject(module, tablename, d);
+ return _PyModule_Add(module, tablename, d);
}
/* Return -1 on failure, 0 on success. */
@@ -16778,11 +16778,9 @@ posixmodule_exec(PyObject *m)
#endif
/* Initialize environ dictionary */
- PyObject *v = convertenviron();
- Py_XINCREF(v);
- if (v == NULL || PyModule_AddObject(m, "environ", v) != 0)
+ if (_PyModule_Add(m, "environ", convertenviron()) != 0) {
return -1;
- Py_DECREF(v);
+ }
if (all_ins(m))
return -1;
@@ -16897,9 +16895,7 @@ posixmodule_exec(PyObject *m)
Py_DECREF(unicode);
}
- PyModule_AddObject(m, "_have_functions", list);
-
- return 0;
+ return _PyModule_Add(m, "_have_functions", list);
}
diff --git a/Modules/timemodule.c b/Modules/timemodule.c
index 3607855..f5b0f39 100644
--- a/Modules/timemodule.c
+++ b/Modules/timemodule.c
@@ -1790,11 +1790,9 @@ init_timezone(PyObject *m)
return -1;
}
#endif // MS_WINDOWS
- PyObject *tzname_obj = Py_BuildValue("(NN)", otz0, otz1);
- if (tzname_obj == NULL) {
+ if (_PyModule_Add(m, "tzname", Py_BuildValue("(NN)", otz0, otz1)) < 0) {
return -1;
}
- PyModule_AddObject(m, "tzname", tzname_obj);
#else // !HAVE_DECL_TZNAME
static const time_t YEAR = (365 * 24 + 6) * 3600;
time_t t;
@@ -1837,10 +1835,9 @@ init_timezone(PyObject *m)
PyModule_AddIntConstant(m, "daylight", janzone != julyzone);
tzname_obj = Py_BuildValue("(zz)", janname, julyname);
}
- if (tzname_obj == NULL) {
+ if (_PyModule_Add(m, "tzname", tzname_obj) < 0) {
return -1;
}
- PyModule_AddObject(m, "tzname", tzname_obj);
#endif // !HAVE_DECL_TZNAME
if (PyErr_Occurred()) {
diff --git a/Python/modsupport.c b/Python/modsupport.c
index be229c9..df4ae35 100644
--- a/Python/modsupport.c
+++ b/Python/modsupport.c
@@ -649,13 +649,16 @@ PyModule_AddObjectRef(PyObject *mod, const char *name, PyObject *value)
PyModule_GetName(mod));
return -1;
}
-
- if (PyDict_SetItemString(dict, name, value)) {
- return -1;
- }
- return 0;
+ return PyDict_SetItemString(dict, name, value);
}
+int
+_PyModule_Add(PyObject *mod, const char *name, PyObject *value)
+{
+ int res = PyModule_AddObjectRef(mod, name, value);
+ Py_XDECREF(value);
+ return res;
+}
int
PyModule_AddObject(PyObject *mod, const char *name, PyObject *value)
@@ -670,25 +673,13 @@ PyModule_AddObject(PyObject *mod, const char *name, PyObject *value)
int
PyModule_AddIntConstant(PyObject *m, const char *name, long value)
{
- PyObject *obj = PyLong_FromLong(value);
- if (!obj) {
- return -1;
- }
- int res = PyModule_AddObjectRef(m, name, obj);
- Py_DECREF(obj);
- return res;
+ return _PyModule_Add(m, name, PyLong_FromLong(value));
}
int
PyModule_AddStringConstant(PyObject *m, const char *name, const char *value)
{
- PyObject *obj = PyUnicode_FromString(value);
- if (!obj) {
- return -1;
- }
- int res = PyModule_AddObjectRef(m, name, obj);
- Py_DECREF(obj);
- return res;
+ return _PyModule_Add(m, name, PyUnicode_FromString(value));
}
int