Skip to content

Commit

Permalink
[3.11] gh-86493: Fix possible leaks in modules initialization: _curse…
Browse files Browse the repository at this point in the history
…s_panel, _decimal, posix, xxsubtype (GH-106767) (GH-106849) (GH-106851)

(cherry picked from commit 7454923)
(cherry picked from commit 970cb8e)
  • Loading branch information
serhiy-storchaka authored Jul 18, 2023
1 parent fb04874 commit 3841af4
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 84 deletions.
4 changes: 1 addition & 3 deletions Modules/_curses_panel.c
Original file line number Diff line number Diff line change
Expand Up @@ -670,9 +670,7 @@ _curses_panel_exec(PyObject *mod)
state->PyCursesError = PyErr_NewException(
"_curses_panel.error", NULL, NULL);

Py_INCREF(state->PyCursesError);
if (PyModule_AddObject(mod, "error", state->PyCursesError) < 0) {
Py_DECREF(state->PyCursesError);
if (PyModule_AddObjectRef(mod, "error", state->PyCursesError) < 0) {
return -1;
}

Expand Down
46 changes: 16 additions & 30 deletions Modules/_decimal/_decimal.c
Original file line number Diff line number Diff line change
Expand Up @@ -5922,21 +5922,15 @@ 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",
(PyObject *)&PyDecContext_Type));
Py_INCREF(DecimalTuple);
CHECK_INT(PyModule_AddObject(m, "DecimalTuple", (PyObject *)DecimalTuple));

CHECK_INT(PyModule_AddObjectRef(m, "Decimal", (PyObject *)&PyDec_Type));
CHECK_INT(PyModule_AddObjectRef(m, "Context", (PyObject *)&PyDecContext_Type));
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));
Expand Down Expand Up @@ -5976,8 +5970,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);
Expand Down Expand Up @@ -6007,45 +6000,39 @@ 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",
default_context_template));
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",
basic_context_template));
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",
extended_context_template));
CHECK_INT(PyModule_AddObjectRef(m, "ExtendedContext",
extended_context_template));


/* Init mpd_ssize_t constants */
Expand All @@ -6064,8 +6051,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 */
Expand Down
67 changes: 22 additions & 45 deletions Modules/posixmodule.c
Original file line number Diff line number Diff line change
Expand Up @@ -15849,42 +15849,34 @@ posixmodule_exec(PyObject *m)
if (setup_confname_tables(m))
return -1;

Py_INCREF(PyExc_OSError);
PyModule_AddObject(m, "error", PyExc_OSError);
if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) {
return -1;
}

#if defined(HAVE_WAITID) && !defined(__APPLE__)
waitid_result_desc.name = MODNAME ".waitid_result";
PyObject *WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc);
if (WaitidResultType == NULL) {
state->WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc);
if (PyModule_AddObjectRef(m, "waitid_result", state->WaitidResultType) < 0) {
return -1;
}
Py_INCREF(WaitidResultType);
PyModule_AddObject(m, "waitid_result", WaitidResultType);
state->WaitidResultType = WaitidResultType;
#endif

stat_result_desc.name = "os.stat_result"; /* see issue #19209 */
stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
PyObject *StatResultType = (PyObject *)PyStructSequence_NewType(&stat_result_desc);
if (StatResultType == NULL) {
state->StatResultType = (PyObject *)PyStructSequence_NewType(&stat_result_desc);
if (PyModule_AddObjectRef(m, "stat_result", state->StatResultType) < 0) {
return -1;
}
Py_INCREF(StatResultType);
PyModule_AddObject(m, "stat_result", StatResultType);
state->StatResultType = StatResultType;
structseq_new = ((PyTypeObject *)StatResultType)->tp_new;
((PyTypeObject *)StatResultType)->tp_new = statresult_new;
structseq_new = ((PyTypeObject *)state->StatResultType)->tp_new;
((PyTypeObject *)state->StatResultType)->tp_new = statresult_new;

statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */
PyObject *StatVFSResultType = (PyObject *)PyStructSequence_NewType(&statvfs_result_desc);
if (StatVFSResultType == NULL) {
state->StatVFSResultType = (PyObject *)PyStructSequence_NewType(&statvfs_result_desc);
if (PyModule_AddObjectRef(m, "statvfs_result", state->StatVFSResultType) < 0) {
return -1;
}
Py_INCREF(StatVFSResultType);
PyModule_AddObject(m, "statvfs_result", StatVFSResultType);
state->StatVFSResultType = StatVFSResultType;
#ifdef NEED_TICKS_PER_SECOND
# if defined(HAVE_SYSCONF) && defined(_SC_CLK_TCK)
ticks_per_second = sysconf(_SC_CLK_TCK);
Expand All @@ -15897,24 +15889,18 @@ posixmodule_exec(PyObject *m)

#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM)
sched_param_desc.name = MODNAME ".sched_param";
PyObject *SchedParamType = (PyObject *)PyStructSequence_NewType(&sched_param_desc);
if (SchedParamType == NULL) {
state->SchedParamType = (PyObject *)PyStructSequence_NewType(&sched_param_desc);
if (PyModule_AddObjectRef(m, "sched_param", state->SchedParamType) < 0) {
return -1;
}
Py_INCREF(SchedParamType);
PyModule_AddObject(m, "sched_param", SchedParamType);
state->SchedParamType = SchedParamType;
((PyTypeObject *)SchedParamType)->tp_new = os_sched_param;
((PyTypeObject *)state->SchedParamType)->tp_new = os_sched_param;
#endif

/* initialize TerminalSize_info */
PyObject *TerminalSizeType = (PyObject *)PyStructSequence_NewType(&TerminalSize_desc);
if (TerminalSizeType == NULL) {
state->TerminalSizeType = (PyObject *)PyStructSequence_NewType(&TerminalSize_desc);
if (PyModule_AddObjectRef(m, "terminal_size", state->TerminalSizeType) < 0) {
return -1;
}
Py_INCREF(TerminalSizeType);
PyModule_AddObject(m, "terminal_size", TerminalSizeType);
state->TerminalSizeType = TerminalSizeType;

/* initialize scandir types */
PyObject *ScandirIteratorType = PyType_FromModuleAndSpec(m, &ScandirIteratorType_spec, NULL);
Expand All @@ -15923,30 +15909,21 @@ posixmodule_exec(PyObject *m)
}
state->ScandirIteratorType = ScandirIteratorType;

PyObject *DirEntryType = PyType_FromModuleAndSpec(m, &DirEntryType_spec, NULL);
if (DirEntryType == NULL) {
state->DirEntryType = PyType_FromModuleAndSpec(m, &DirEntryType_spec, NULL);
if (PyModule_AddObjectRef(m, "DirEntry", state->DirEntryType) < 0) {
return -1;
}
Py_INCREF(DirEntryType);
PyModule_AddObject(m, "DirEntry", DirEntryType);
state->DirEntryType = DirEntryType;

times_result_desc.name = MODNAME ".times_result";
PyObject *TimesResultType = (PyObject *)PyStructSequence_NewType(&times_result_desc);
if (TimesResultType == NULL) {
state->TimesResultType = (PyObject *)PyStructSequence_NewType(&times_result_desc);
if (PyModule_AddObjectRef(m, "times_result", state->TimesResultType) < 0) {
return -1;
}
Py_INCREF(TimesResultType);
PyModule_AddObject(m, "times_result", TimesResultType);
state->TimesResultType = TimesResultType;

PyTypeObject *UnameResultType = PyStructSequence_NewType(&uname_result_desc);
if (UnameResultType == NULL) {
state->UnameResultType = (PyObject *)PyStructSequence_NewType(&uname_result_desc);
if (PyModule_AddObjectRef(m, "uname_result", state->UnameResultType) < 0) {
return -1;
}
Py_INCREF(UnameResultType);
PyModule_AddObject(m, "uname_result", (PyObject *)UnameResultType);
state->UnameResultType = (PyObject *)UnameResultType;

if ((state->billion = PyLong_FromLong(1000000000)) == NULL)
return -1;
Expand Down
10 changes: 4 additions & 6 deletions Modules/xxsubtype.c
Original file line number Diff line number Diff line change
Expand Up @@ -279,14 +279,12 @@ xxsubtype_exec(PyObject* m)
if (PyType_Ready(&spamdict_type) < 0)
return -1;

Py_INCREF(&spamlist_type);
if (PyModule_AddObject(m, "spamlist",
(PyObject *) &spamlist_type) < 0)
if (PyModule_AddObjectRef(m, "spamlist",
(PyObject *) &spamlist_type) < 0)
return -1;

Py_INCREF(&spamdict_type);
if (PyModule_AddObject(m, "spamdict",
(PyObject *) &spamdict_type) < 0)
if (PyModule_AddObjectRef(m, "spamdict",
(PyObject *) &spamdict_type) < 0)
return -1;
return 0;
}
Expand Down

0 comments on commit 3841af4

Please sign in to comment.