From ae57c47d748efa73368b034d480e3dee9b23d4bc Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Wed, 2 Nov 2022 22:55:01 -0700 Subject: [PATCH 1/5] gh-83004: Clean up refleaks in _decimal initialisation --- Modules/_decimal/_decimal.c | 45 +++++++++++++++---------------------- 1 file changed, 18 insertions(+), 27 deletions(-) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 548bd601b0eb87..87ab269a1cd15f 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -5918,21 +5918,17 @@ PyInit__decimal(void) /* Add types to the module */ - Py_INCREF(&PyDec_Type); - CHECK_INT(PyModule_AddObject(m, "Decimal", (PyObject *)&PyDec_Type)); - Py_INCREF(&PyDecContext_Type); - CHECK_INT(PyModule_AddObject(m, "Context", + CHECK_INT(PyModule_AddObjectRef(m, "Decimal", (PyObject *)&PyDec_Type)); + CHECK_INT(PyModule_AddObjectRef(m, "Context", (PyObject *)&PyDecContext_Type)); - Py_INCREF(DecimalTuple); - CHECK_INT(PyModule_AddObject(m, "DecimalTuple", (PyObject *)DecimalTuple)); + CHECK_INT(PyModule_AddObjectRef(m, "DecimalTuple", (PyObject *)DecimalTuple)); /* Create top level exception */ ASSIGN_PTR(DecimalException, PyErr_NewException( "decimal.DecimalException", PyExc_ArithmeticError, NULL)); - Py_INCREF(DecimalException); - CHECK_INT(PyModule_AddObject(m, "DecimalException", DecimalException)); + CHECK_INT(PyModule_AddObjectRef(m, "DecimalException", DecimalException)); /* Create signal tuple */ ASSIGN_PTR(SignalTuple, PyTuple_New(SIGNAL_MAP_LEN)); @@ -5972,8 +5968,7 @@ PyInit__decimal(void) Py_DECREF(base); /* add to module */ - Py_INCREF(cm->ex); - CHECK_INT(PyModule_AddObject(m, cm->name, cm->ex)); + CHECK_INT(PyModule_AddObjectRef(m, cm->name, cm->ex)); /* add to signal tuple */ Py_INCREF(cm->ex); @@ -6003,51 +5998,48 @@ PyInit__decimal(void) ASSIGN_PTR(cm->ex, PyErr_NewException(cm->fqname, base, NULL)); Py_DECREF(base); - Py_INCREF(cm->ex); - CHECK_INT(PyModule_AddObject(m, cm->name, cm->ex)); + CHECK_INT(PyModule_AddObjectRef(m, cm->name, cm->ex)); } /* Init default context template first */ ASSIGN_PTR(default_context_template, PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); - Py_INCREF(default_context_template); - CHECK_INT(PyModule_AddObject(m, "DefaultContext", + CHECK_INT(PyModule_AddObjectRef(m, "DefaultContext", default_context_template)); #ifndef WITH_DECIMAL_CONTEXTVAR ASSIGN_PTR(tls_context_key, PyUnicode_FromString("___DECIMAL_CTX__")); - Py_INCREF(Py_False); - CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_False)); + CHECK_INT(PyModule_AddObjectRef(m, "HAVE_CONTEXTVAR", Py_False)); #else ASSIGN_PTR(current_context_var, PyContextVar_New("decimal_context", NULL)); - Py_INCREF(Py_True); - CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_True)); + CHECK_INT(PyModule_AddObjectRef(m, "HAVE_CONTEXTVAR", Py_True)); #endif - Py_INCREF(Py_True); - CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_True)); + CHECK_INT(PyModule_AddObjectRef(m, "HAVE_THREADS", Py_True)); /* Init basic context template */ ASSIGN_PTR(basic_context_template, PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); init_basic_context(basic_context_template); - Py_INCREF(basic_context_template); - CHECK_INT(PyModule_AddObject(m, "BasicContext", + CHECK_INT(PyModule_AddObjectRef(m, "BasicContext", basic_context_template)); /* Init extended context template */ ASSIGN_PTR(extended_context_template, PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); init_extended_context(extended_context_template); - Py_INCREF(extended_context_template); - CHECK_INT(PyModule_AddObject(m, "ExtendedContext", + CHECK_INT(PyModule_AddObjectRef(m, "ExtendedContext", extended_context_template)); /* Init mpd_ssize_t constants */ for (ssize_cm = ssize_constants; ssize_cm->name != NULL; ssize_cm++) { ASSIGN_PTR(obj, PyLong_FromSsize_t(ssize_cm->val)); - CHECK_INT(PyModule_AddObject(m, ssize_cm->name, obj)); + if (PyModule_AddObjectRef(m, ssize_cm->name, obj) < 0) { + Py_DECREF(obj); + goto error; + } + Py_DECREF(obj); obj = NULL; } @@ -6060,8 +6052,7 @@ PyInit__decimal(void) /* Init string constants */ for (i = 0; i < _PY_DEC_ROUND_GUARD; i++) { ASSIGN_PTR(round_map[i], PyUnicode_InternFromString(mpd_round_string[i])); - Py_INCREF(round_map[i]); - CHECK_INT(PyModule_AddObject(m, mpd_round_string[i], round_map[i])); + CHECK_INT(PyModule_AddObjectRef(m, mpd_round_string[i], round_map[i])); } /* Add specification version number */ From ce6ce7529c7b1165eb16cb864aabdd2bf5284dca Mon Sep 17 00:00:00 2001 From: "blurb-it[bot]" <43283697+blurb-it[bot]@users.noreply.github.com> Date: Thu, 3 Nov 2022 05:56:57 +0000 Subject: [PATCH 2/5] =?UTF-8?q?=F0=9F=93=9C=F0=9F=A4=96=20Added=20by=20blu?= =?UTF-8?q?rb=5Fit.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../next/Library/2022-11-03-05-56-54.gh-issue-83004.kr0Gla.rst | 1 + 1 file changed, 1 insertion(+) create mode 100644 Misc/NEWS.d/next/Library/2022-11-03-05-56-54.gh-issue-83004.kr0Gla.rst diff --git a/Misc/NEWS.d/next/Library/2022-11-03-05-56-54.gh-issue-83004.kr0Gla.rst b/Misc/NEWS.d/next/Library/2022-11-03-05-56-54.gh-issue-83004.kr0Gla.rst new file mode 100644 index 00000000000000..516e0424adf0af --- /dev/null +++ b/Misc/NEWS.d/next/Library/2022-11-03-05-56-54.gh-issue-83004.kr0Gla.rst @@ -0,0 +1 @@ +Clean up refleaks on failed module initialisation in in :mod:`_decimal` From 7b8bea9739a4c434ff666335a974655f86ddf28f Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Wed, 2 Nov 2022 23:59:14 -0700 Subject: [PATCH 3/5] undo change to obj --- Modules/_decimal/_decimal.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 87ab269a1cd15f..60692d8d207999 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -6035,12 +6035,7 @@ PyInit__decimal(void) /* Init mpd_ssize_t constants */ for (ssize_cm = ssize_constants; ssize_cm->name != NULL; ssize_cm++) { ASSIGN_PTR(obj, PyLong_FromSsize_t(ssize_cm->val)); - if (PyModule_AddObjectRef(m, ssize_cm->name, obj) < 0) { - Py_DECREF(obj); - goto error; - } - Py_DECREF(obj); - obj = NULL; + CHECK_INT(PyModule_AddObject(m, ssize_cm->name, obj)); } /* Init int constants */ From a7576b372c9f9b26eb3ec10abf9c45c472e94435 Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Thu, 3 Nov 2022 00:05:21 -0700 Subject: [PATCH 4/5] fix whitespace --- Modules/_decimal/_decimal.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 60692d8d207999..8ba335471aa61a 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -5920,7 +5920,7 @@ PyInit__decimal(void) /* Add types to the module */ CHECK_INT(PyModule_AddObjectRef(m, "Decimal", (PyObject *)&PyDec_Type)); CHECK_INT(PyModule_AddObjectRef(m, "Context", - (PyObject *)&PyDecContext_Type)); + (PyObject *)&PyDecContext_Type)); CHECK_INT(PyModule_AddObjectRef(m, "DecimalTuple", (PyObject *)DecimalTuple)); @@ -6006,7 +6006,7 @@ PyInit__decimal(void) ASSIGN_PTR(default_context_template, PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); CHECK_INT(PyModule_AddObjectRef(m, "DefaultContext", - default_context_template)); + default_context_template)); #ifndef WITH_DECIMAL_CONTEXTVAR ASSIGN_PTR(tls_context_key, PyUnicode_FromString("___DECIMAL_CTX__")); @@ -6022,14 +6022,14 @@ PyInit__decimal(void) PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); init_basic_context(basic_context_template); CHECK_INT(PyModule_AddObjectRef(m, "BasicContext", - basic_context_template)); + basic_context_template)); /* Init extended context template */ ASSIGN_PTR(extended_context_template, PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); init_extended_context(extended_context_template); CHECK_INT(PyModule_AddObjectRef(m, "ExtendedContext", - extended_context_template)); + extended_context_template)); /* Init mpd_ssize_t constants */ From 317fb61965da715c89ad2293dd5ebf6eb246a2fc Mon Sep 17 00:00:00 2001 From: hauntsaninja Date: Thu, 3 Nov 2022 00:06:23 -0700 Subject: [PATCH 5/5] undo change to obj --- Modules/_decimal/_decimal.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Modules/_decimal/_decimal.c b/Modules/_decimal/_decimal.c index 8ba335471aa61a..0fc25592d4404e 100644 --- a/Modules/_decimal/_decimal.c +++ b/Modules/_decimal/_decimal.c @@ -6036,6 +6036,7 @@ PyInit__decimal(void) for (ssize_cm = ssize_constants; ssize_cm->name != NULL; ssize_cm++) { ASSIGN_PTR(obj, PyLong_FromSsize_t(ssize_cm->val)); CHECK_INT(PyModule_AddObject(m, ssize_cm->name, obj)); + obj = NULL; } /* Init int constants */