Skip to content

Commit 7454923

Browse files
gh-86493: Fix possible leaks in modules initialization: _curses_panel, _decimal, posix, xxsubtype (GH-106767)
1 parent e1c295e commit 7454923

File tree

4 files changed

+37
-55
lines changed

4 files changed

+37
-55
lines changed

Modules/_curses_panel.c

+1-2
Original file line numberDiff line numberDiff line change
@@ -662,8 +662,7 @@ _curses_panel_exec(PyObject *mod)
662662
state->PyCursesError = PyErr_NewException(
663663
"_curses_panel.error", NULL, NULL);
664664

665-
if (PyModule_AddObject(mod, "error", Py_NewRef(state->PyCursesError)) < 0) {
666-
Py_DECREF(state->PyCursesError);
665+
if (PyModule_AddObjectRef(mod, "error", state->PyCursesError) < 0) {
667666
return -1;
668667
}
669668

Modules/_decimal/_decimal.c

+12-12
Original file line numberDiff line numberDiff line change
@@ -5957,7 +5957,7 @@ PyInit__decimal(void)
59575957
Py_DECREF(base);
59585958

59595959
/* add to module */
5960-
CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex)));
5960+
CHECK_INT(PyModule_AddObjectRef(m, cm->name, cm->ex));
59615961

59625962
/* add to signal tuple */
59635963
PyTuple_SET_ITEM(state->SignalTuple, i, Py_NewRef(cm->ex));
@@ -5986,39 +5986,39 @@ PyInit__decimal(void)
59865986
ASSIGN_PTR(cm->ex, PyErr_NewException(cm->fqname, base, NULL));
59875987
Py_DECREF(base);
59885988

5989-
CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex)));
5989+
CHECK_INT(PyModule_AddObjectRef(m, cm->name, cm->ex));
59905990
}
59915991

59925992

59935993
/* Init default context template first */
59945994
ASSIGN_PTR(state->default_context_template,
59955995
PyObject_CallObject((PyObject *)state->PyDecContext_Type, NULL));
5996-
CHECK_INT(PyModule_AddObject(m, "DefaultContext",
5997-
Py_NewRef(state->default_context_template)));
5996+
CHECK_INT(PyModule_AddObjectRef(m, "DefaultContext",
5997+
state->default_context_template));
59985998

59995999
#ifndef WITH_DECIMAL_CONTEXTVAR
60006000
ASSIGN_PTR(state->tls_context_key,
60016001
PyUnicode_FromString("___DECIMAL_CTX__"));
6002-
CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_NewRef(Py_False)));
6002+
CHECK_INT(PyModule_AddObjectRef(m, "HAVE_CONTEXTVAR", Py_False));
60036003
#else
60046004
ASSIGN_PTR(state->current_context_var, PyContextVar_New("decimal_context", NULL));
6005-
CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_NewRef(Py_True)));
6005+
CHECK_INT(PyModule_AddObjectRef(m, "HAVE_CONTEXTVAR", Py_True));
60066006
#endif
6007-
CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_NewRef(Py_True)));
6007+
CHECK_INT(PyModule_AddObjectRef(m, "HAVE_THREADS", Py_True));
60086008

60096009
/* Init basic context template */
60106010
ASSIGN_PTR(state->basic_context_template,
60116011
PyObject_CallObject((PyObject *)state->PyDecContext_Type, NULL));
60126012
init_basic_context(state->basic_context_template);
6013-
CHECK_INT(PyModule_AddObject(m, "BasicContext",
6014-
Py_NewRef(state->basic_context_template)));
6013+
CHECK_INT(PyModule_AddObjectRef(m, "BasicContext",
6014+
state->basic_context_template));
60156015

60166016
/* Init extended context template */
60176017
ASSIGN_PTR(state->extended_context_template,
60186018
PyObject_CallObject((PyObject *)state->PyDecContext_Type, NULL));
60196019
init_extended_context(state->extended_context_template);
6020-
CHECK_INT(PyModule_AddObject(m, "ExtendedContext",
6021-
Py_NewRef(state->extended_context_template)));
6020+
CHECK_INT(PyModule_AddObjectRef(m, "ExtendedContext",
6021+
state->extended_context_template));
60226022

60236023

60246024
/* Init mpd_ssize_t constants */
@@ -6037,7 +6037,7 @@ PyInit__decimal(void)
60376037
/* Init string constants */
60386038
for (i = 0; i < _PY_DEC_ROUND_GUARD; i++) {
60396039
ASSIGN_PTR(state->round_map[i], PyUnicode_InternFromString(mpd_round_string[i]));
6040-
CHECK_INT(PyModule_AddObject(m, mpd_round_string[i], Py_NewRef(state->round_map[i])));
6040+
CHECK_INT(PyModule_AddObjectRef(m, mpd_round_string[i], state->round_map[i]));
60416041
}
60426042

60436043
/* Add specification version number */

Modules/posixmodule.c

+22-37
Original file line numberDiff line numberDiff line change
@@ -16793,57 +16793,49 @@ posixmodule_exec(PyObject *m)
1679316793
if (setup_confname_tables(m))
1679416794
return -1;
1679516795

16796-
PyModule_AddObject(m, "error", Py_NewRef(PyExc_OSError));
16796+
if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) {
16797+
return -1;
16798+
}
1679716799

1679816800
#if defined(HAVE_WAITID) && !defined(__APPLE__)
1679916801
waitid_result_desc.name = MODNAME ".waitid_result";
16800-
PyObject *WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc);
16801-
if (WaitidResultType == NULL) {
16802+
state->WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc);
16803+
if (PyModule_AddObjectRef(m, "waitid_result", state->WaitidResultType) < 0) {
1680216804
return -1;
1680316805
}
16804-
PyModule_AddObject(m, "waitid_result", Py_NewRef(WaitidResultType));
16805-
state->WaitidResultType = WaitidResultType;
1680616806
#endif
1680716807

1680816808
stat_result_desc.name = "os.stat_result"; /* see issue #19209 */
1680916809
stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
1681016810
stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
1681116811
stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
16812-
PyObject *StatResultType = (PyObject *)PyStructSequence_NewType(&stat_result_desc);
16813-
if (StatResultType == NULL) {
16812+
state->StatResultType = (PyObject *)PyStructSequence_NewType(&stat_result_desc);
16813+
if (PyModule_AddObjectRef(m, "stat_result", state->StatResultType) < 0) {
1681416814
return -1;
1681516815
}
16816-
PyModule_AddObject(m, "stat_result", Py_NewRef(StatResultType));
16817-
state->StatResultType = StatResultType;
16818-
state->statresult_new_orig = ((PyTypeObject *)StatResultType)->tp_new;
16819-
((PyTypeObject *)StatResultType)->tp_new = statresult_new;
16816+
state->statresult_new_orig = ((PyTypeObject *)state->StatResultType)->tp_new;
16817+
((PyTypeObject *)state->StatResultType)->tp_new = statresult_new;
1682016818

1682116819
statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */
16822-
PyObject *StatVFSResultType = (PyObject *)PyStructSequence_NewType(&statvfs_result_desc);
16823-
if (StatVFSResultType == NULL) {
16820+
state->StatVFSResultType = (PyObject *)PyStructSequence_NewType(&statvfs_result_desc);
16821+
if (PyModule_AddObjectRef(m, "statvfs_result", state->StatVFSResultType) < 0) {
1682416822
return -1;
1682516823
}
16826-
PyModule_AddObject(m, "statvfs_result", Py_NewRef(StatVFSResultType));
16827-
state->StatVFSResultType = StatVFSResultType;
1682816824

1682916825
#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM)
1683016826
sched_param_desc.name = MODNAME ".sched_param";
16831-
PyObject *SchedParamType = (PyObject *)PyStructSequence_NewType(&sched_param_desc);
16832-
if (SchedParamType == NULL) {
16827+
state->SchedParamType = (PyObject *)PyStructSequence_NewType(&sched_param_desc);
16828+
if (PyModule_AddObjectRef(m, "sched_param", state->SchedParamType) < 0) {
1683316829
return -1;
1683416830
}
16835-
PyModule_AddObject(m, "sched_param", Py_NewRef(SchedParamType));
16836-
state->SchedParamType = SchedParamType;
16837-
((PyTypeObject *)SchedParamType)->tp_new = os_sched_param;
16831+
((PyTypeObject *)state->SchedParamType)->tp_new = os_sched_param;
1683816832
#endif
1683916833

1684016834
/* initialize TerminalSize_info */
16841-
PyObject *TerminalSizeType = (PyObject *)PyStructSequence_NewType(&TerminalSize_desc);
16842-
if (TerminalSizeType == NULL) {
16835+
state->TerminalSizeType = (PyObject *)PyStructSequence_NewType(&TerminalSize_desc);
16836+
if (PyModule_AddObjectRef(m, "terminal_size", state->TerminalSizeType) < 0) {
1684316837
return -1;
1684416838
}
16845-
PyModule_AddObject(m, "terminal_size", Py_NewRef(TerminalSizeType));
16846-
state->TerminalSizeType = TerminalSizeType;
1684716839

1684816840
/* initialize scandir types */
1684916841
PyObject *ScandirIteratorType = PyType_FromModuleAndSpec(m, &ScandirIteratorType_spec, NULL);
@@ -16852,28 +16844,21 @@ posixmodule_exec(PyObject *m)
1685216844
}
1685316845
state->ScandirIteratorType = ScandirIteratorType;
1685416846

16855-
PyObject *DirEntryType = PyType_FromModuleAndSpec(m, &DirEntryType_spec, NULL);
16856-
if (DirEntryType == NULL) {
16847+
state->DirEntryType = PyType_FromModuleAndSpec(m, &DirEntryType_spec, NULL);
16848+
if (PyModule_AddObjectRef(m, "DirEntry", state->DirEntryType) < 0) {
1685716849
return -1;
1685816850
}
16859-
PyModule_AddObject(m, "DirEntry", Py_NewRef(DirEntryType));
16860-
state->DirEntryType = DirEntryType;
1686116851

1686216852
times_result_desc.name = MODNAME ".times_result";
16863-
PyObject *TimesResultType = (PyObject *)PyStructSequence_NewType(&times_result_desc);
16864-
if (TimesResultType == NULL) {
16853+
state->TimesResultType = (PyObject *)PyStructSequence_NewType(&times_result_desc);
16854+
if (PyModule_AddObjectRef(m, "times_result", state->TimesResultType) < 0) {
1686516855
return -1;
1686616856
}
16867-
PyModule_AddObject(m, "times_result", Py_NewRef(TimesResultType));
16868-
state->TimesResultType = TimesResultType;
1686916857

16870-
PyTypeObject *UnameResultType = PyStructSequence_NewType(&uname_result_desc);
16871-
if (UnameResultType == NULL) {
16858+
state->UnameResultType = (PyObject *)PyStructSequence_NewType(&uname_result_desc);
16859+
if (PyModule_AddObjectRef(m, "uname_result", state->UnameResultType) < 0) {
1687216860
return -1;
1687316861
}
16874-
;
16875-
PyModule_AddObject(m, "uname_result", Py_NewRef(UnameResultType));
16876-
state->UnameResultType = (PyObject *)UnameResultType;
1687716862

1687816863
if ((state->billion = PyLong_FromLong(1000000000)) == NULL)
1687916864
return -1;

Modules/xxsubtype.c

+2-4
Original file line numberDiff line numberDiff line change
@@ -274,12 +274,10 @@ xxsubtype_exec(PyObject* m)
274274
if (PyType_Ready(&spamdict_type) < 0)
275275
return -1;
276276

277-
if (PyModule_AddObject(m, "spamlist",
278-
Py_NewRef(&spamlist_type)) < 0)
277+
if (PyModule_AddObjectRef(m, "spamlist", (PyObject *)&spamlist_type) < 0)
279278
return -1;
280279

281-
if (PyModule_AddObject(m, "spamdict",
282-
Py_NewRef(&spamdict_type)) < 0)
280+
if (PyModule_AddObjectRef(m, "spamdict", (PyObject *)&spamdict_type) < 0)
283281
return -1;
284282
return 0;
285283
}

0 commit comments

Comments
 (0)