[3.12] gh-86493: Fix possible leaks in modules initialization: _curses_panel, _decimal, posix, xxsubtype (GH-106767) (#106849)

(cherry picked from commit 745492355b)
This commit is contained in:
Serhiy Storchaka 2023-07-18 10:03:59 +03:00 committed by GitHub
parent d671c6567a
commit 970cb8eaba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 60 deletions

View file

@ -662,8 +662,7 @@ _curses_panel_exec(PyObject *mod)
state->PyCursesError = PyErr_NewException( state->PyCursesError = PyErr_NewException(
"_curses_panel.error", NULL, NULL); "_curses_panel.error", NULL, NULL);
if (PyModule_AddObject(mod, "error", Py_NewRef(state->PyCursesError)) < 0) { if (PyModule_AddObjectRef(mod, "error", state->PyCursesError) < 0) {
Py_DECREF(state->PyCursesError);
return -1; return -1;
} }

View file

@ -5871,16 +5871,15 @@ PyInit__decimal(void)
ASSIGN_PTR(m, PyModule_Create(&_decimal_module)); ASSIGN_PTR(m, PyModule_Create(&_decimal_module));
/* Add types to the module */ /* Add types to the module */
CHECK_INT(PyModule_AddObject(m, "Decimal", Py_NewRef(&PyDec_Type))); CHECK_INT(PyModule_AddObjectRef(m, "Decimal", (PyObject *)&PyDec_Type));
CHECK_INT(PyModule_AddObject(m, "Context", CHECK_INT(PyModule_AddObjectRef(m, "Context", (PyObject *)&PyDecContext_Type));
Py_NewRef(&PyDecContext_Type))); CHECK_INT(PyModule_AddObjectRef(m, "DecimalTuple", (PyObject *)DecimalTuple));
CHECK_INT(PyModule_AddObject(m, "DecimalTuple", Py_NewRef(DecimalTuple)));
/* Create top level exception */ /* Create top level exception */
ASSIGN_PTR(DecimalException, PyErr_NewException( ASSIGN_PTR(DecimalException, PyErr_NewException(
"decimal.DecimalException", "decimal.DecimalException",
PyExc_ArithmeticError, NULL)); PyExc_ArithmeticError, NULL));
CHECK_INT(PyModule_AddObject(m, "DecimalException", Py_NewRef(DecimalException))); CHECK_INT(PyModule_AddObjectRef(m, "DecimalException", DecimalException));
/* Create signal tuple */ /* Create signal tuple */
ASSIGN_PTR(SignalTuple, PyTuple_New(SIGNAL_MAP_LEN)); ASSIGN_PTR(SignalTuple, PyTuple_New(SIGNAL_MAP_LEN));
@ -5920,7 +5919,7 @@ PyInit__decimal(void)
Py_DECREF(base); Py_DECREF(base);
/* add to module */ /* add to module */
CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex))); CHECK_INT(PyModule_AddObjectRef(m, cm->name, cm->ex));
/* add to signal tuple */ /* add to signal tuple */
PyTuple_SET_ITEM(SignalTuple, i, Py_NewRef(cm->ex)); PyTuple_SET_ITEM(SignalTuple, i, Py_NewRef(cm->ex));
@ -5949,38 +5948,38 @@ PyInit__decimal(void)
ASSIGN_PTR(cm->ex, PyErr_NewException(cm->fqname, base, NULL)); ASSIGN_PTR(cm->ex, PyErr_NewException(cm->fqname, base, NULL));
Py_DECREF(base); Py_DECREF(base);
CHECK_INT(PyModule_AddObject(m, cm->name, Py_NewRef(cm->ex))); CHECK_INT(PyModule_AddObjectRef(m, cm->name, cm->ex));
} }
/* Init default context template first */ /* Init default context template first */
ASSIGN_PTR(default_context_template, ASSIGN_PTR(default_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
CHECK_INT(PyModule_AddObject(m, "DefaultContext", CHECK_INT(PyModule_AddObjectRef(m, "DefaultContext",
Py_NewRef(default_context_template))); default_context_template));
#ifndef WITH_DECIMAL_CONTEXTVAR #ifndef WITH_DECIMAL_CONTEXTVAR
ASSIGN_PTR(tls_context_key, PyUnicode_FromString("___DECIMAL_CTX__")); ASSIGN_PTR(tls_context_key, PyUnicode_FromString("___DECIMAL_CTX__"));
CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_NewRef(Py_False))); CHECK_INT(PyModule_AddObjectRef(m, "HAVE_CONTEXTVAR", Py_False));
#else #else
ASSIGN_PTR(current_context_var, PyContextVar_New("decimal_context", NULL)); ASSIGN_PTR(current_context_var, PyContextVar_New("decimal_context", NULL));
CHECK_INT(PyModule_AddObject(m, "HAVE_CONTEXTVAR", Py_NewRef(Py_True))); CHECK_INT(PyModule_AddObjectRef(m, "HAVE_CONTEXTVAR", Py_True));
#endif #endif
CHECK_INT(PyModule_AddObject(m, "HAVE_THREADS", Py_NewRef(Py_True))); CHECK_INT(PyModule_AddObjectRef(m, "HAVE_THREADS", Py_True));
/* Init basic context template */ /* Init basic context template */
ASSIGN_PTR(basic_context_template, ASSIGN_PTR(basic_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
init_basic_context(basic_context_template); init_basic_context(basic_context_template);
CHECK_INT(PyModule_AddObject(m, "BasicContext", CHECK_INT(PyModule_AddObjectRef(m, "BasicContext",
Py_NewRef(basic_context_template))); basic_context_template));
/* Init extended context template */ /* Init extended context template */
ASSIGN_PTR(extended_context_template, ASSIGN_PTR(extended_context_template,
PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL)); PyObject_CallObject((PyObject *)&PyDecContext_Type, NULL));
init_extended_context(extended_context_template); init_extended_context(extended_context_template);
CHECK_INT(PyModule_AddObject(m, "ExtendedContext", CHECK_INT(PyModule_AddObjectRef(m, "ExtendedContext",
Py_NewRef(extended_context_template))); extended_context_template));
/* Init mpd_ssize_t constants */ /* Init mpd_ssize_t constants */
@ -5999,7 +5998,7 @@ PyInit__decimal(void)
/* Init string constants */ /* Init string constants */
for (i = 0; i < _PY_DEC_ROUND_GUARD; i++) { for (i = 0; i < _PY_DEC_ROUND_GUARD; i++) {
ASSIGN_PTR(round_map[i], PyUnicode_InternFromString(mpd_round_string[i])); ASSIGN_PTR(round_map[i], PyUnicode_InternFromString(mpd_round_string[i]));
CHECK_INT(PyModule_AddObject(m, mpd_round_string[i], Py_NewRef(round_map[i]))); CHECK_INT(PyModule_AddObjectRef(m, mpd_round_string[i], round_map[i]));
} }
/* Add specification version number */ /* Add specification version number */

View file

@ -16790,57 +16790,49 @@ posixmodule_exec(PyObject *m)
if (setup_confname_tables(m)) if (setup_confname_tables(m))
return -1; return -1;
PyModule_AddObject(m, "error", Py_NewRef(PyExc_OSError)); if (PyModule_AddObjectRef(m, "error", PyExc_OSError) < 0) {
return -1;
}
#if defined(HAVE_WAITID) && !defined(__APPLE__) #if defined(HAVE_WAITID) && !defined(__APPLE__)
waitid_result_desc.name = MODNAME ".waitid_result"; waitid_result_desc.name = MODNAME ".waitid_result";
PyObject *WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc); state->WaitidResultType = (PyObject *)PyStructSequence_NewType(&waitid_result_desc);
if (WaitidResultType == NULL) { if (PyModule_AddObjectRef(m, "waitid_result", state->WaitidResultType) < 0) {
return -1; return -1;
} }
PyModule_AddObject(m, "waitid_result", Py_NewRef(WaitidResultType));
state->WaitidResultType = WaitidResultType;
#endif #endif
stat_result_desc.name = "os.stat_result"; /* see issue #19209 */ stat_result_desc.name = "os.stat_result"; /* see issue #19209 */
stat_result_desc.fields[7].name = PyStructSequence_UnnamedField; stat_result_desc.fields[7].name = PyStructSequence_UnnamedField;
stat_result_desc.fields[8].name = PyStructSequence_UnnamedField; stat_result_desc.fields[8].name = PyStructSequence_UnnamedField;
stat_result_desc.fields[9].name = PyStructSequence_UnnamedField; stat_result_desc.fields[9].name = PyStructSequence_UnnamedField;
PyObject *StatResultType = (PyObject *)PyStructSequence_NewType(&stat_result_desc); state->StatResultType = (PyObject *)PyStructSequence_NewType(&stat_result_desc);
if (StatResultType == NULL) { if (PyModule_AddObjectRef(m, "stat_result", state->StatResultType) < 0) {
return -1; return -1;
} }
PyModule_AddObject(m, "stat_result", Py_NewRef(StatResultType)); state->statresult_new_orig = ((PyTypeObject *)state->StatResultType)->tp_new;
state->StatResultType = StatResultType; ((PyTypeObject *)state->StatResultType)->tp_new = statresult_new;
state->statresult_new_orig = ((PyTypeObject *)StatResultType)->tp_new;
((PyTypeObject *)StatResultType)->tp_new = statresult_new;
statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */ statvfs_result_desc.name = "os.statvfs_result"; /* see issue #19209 */
PyObject *StatVFSResultType = (PyObject *)PyStructSequence_NewType(&statvfs_result_desc); state->StatVFSResultType = (PyObject *)PyStructSequence_NewType(&statvfs_result_desc);
if (StatVFSResultType == NULL) { if (PyModule_AddObjectRef(m, "statvfs_result", state->StatVFSResultType) < 0) {
return -1; return -1;
} }
PyModule_AddObject(m, "statvfs_result", Py_NewRef(StatVFSResultType));
state->StatVFSResultType = StatVFSResultType;
#if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM) #if defined(HAVE_SCHED_SETPARAM) || defined(HAVE_SCHED_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDULER) || defined(POSIX_SPAWN_SETSCHEDPARAM)
sched_param_desc.name = MODNAME ".sched_param"; sched_param_desc.name = MODNAME ".sched_param";
PyObject *SchedParamType = (PyObject *)PyStructSequence_NewType(&sched_param_desc); state->SchedParamType = (PyObject *)PyStructSequence_NewType(&sched_param_desc);
if (SchedParamType == NULL) { if (PyModule_AddObjectRef(m, "sched_param", state->SchedParamType) < 0) {
return -1; return -1;
} }
PyModule_AddObject(m, "sched_param", Py_NewRef(SchedParamType)); ((PyTypeObject *)state->SchedParamType)->tp_new = os_sched_param;
state->SchedParamType = SchedParamType;
((PyTypeObject *)SchedParamType)->tp_new = os_sched_param;
#endif #endif
/* initialize TerminalSize_info */ /* initialize TerminalSize_info */
PyObject *TerminalSizeType = (PyObject *)PyStructSequence_NewType(&TerminalSize_desc); state->TerminalSizeType = (PyObject *)PyStructSequence_NewType(&TerminalSize_desc);
if (TerminalSizeType == NULL) { if (PyModule_AddObjectRef(m, "terminal_size", state->TerminalSizeType) < 0) {
return -1; return -1;
} }
PyModule_AddObject(m, "terminal_size", Py_NewRef(TerminalSizeType));
state->TerminalSizeType = TerminalSizeType;
/* initialize scandir types */ /* initialize scandir types */
PyObject *ScandirIteratorType = PyType_FromModuleAndSpec(m, &ScandirIteratorType_spec, NULL); PyObject *ScandirIteratorType = PyType_FromModuleAndSpec(m, &ScandirIteratorType_spec, NULL);
@ -16849,28 +16841,21 @@ posixmodule_exec(PyObject *m)
} }
state->ScandirIteratorType = ScandirIteratorType; state->ScandirIteratorType = ScandirIteratorType;
PyObject *DirEntryType = PyType_FromModuleAndSpec(m, &DirEntryType_spec, NULL); state->DirEntryType = PyType_FromModuleAndSpec(m, &DirEntryType_spec, NULL);
if (DirEntryType == NULL) { if (PyModule_AddObjectRef(m, "DirEntry", state->DirEntryType) < 0) {
return -1; return -1;
} }
PyModule_AddObject(m, "DirEntry", Py_NewRef(DirEntryType));
state->DirEntryType = DirEntryType;
times_result_desc.name = MODNAME ".times_result"; times_result_desc.name = MODNAME ".times_result";
PyObject *TimesResultType = (PyObject *)PyStructSequence_NewType(&times_result_desc); state->TimesResultType = (PyObject *)PyStructSequence_NewType(&times_result_desc);
if (TimesResultType == NULL) { if (PyModule_AddObjectRef(m, "times_result", state->TimesResultType) < 0) {
return -1; return -1;
} }
PyModule_AddObject(m, "times_result", Py_NewRef(TimesResultType));
state->TimesResultType = TimesResultType;
PyTypeObject *UnameResultType = PyStructSequence_NewType(&uname_result_desc); state->UnameResultType = (PyObject *)PyStructSequence_NewType(&uname_result_desc);
if (UnameResultType == NULL) { if (PyModule_AddObjectRef(m, "uname_result", state->UnameResultType) < 0) {
return -1; return -1;
} }
;
PyModule_AddObject(m, "uname_result", Py_NewRef(UnameResultType));
state->UnameResultType = (PyObject *)UnameResultType;
if ((state->billion = PyLong_FromLong(1000000000)) == NULL) if ((state->billion = PyLong_FromLong(1000000000)) == NULL)
return -1; return -1;

View file

@ -274,12 +274,10 @@ xxsubtype_exec(PyObject* m)
if (PyType_Ready(&spamdict_type) < 0) if (PyType_Ready(&spamdict_type) < 0)
return -1; return -1;
if (PyModule_AddObject(m, "spamlist", if (PyModule_AddObjectRef(m, "spamlist", (PyObject *)&spamlist_type) < 0)
Py_NewRef(&spamlist_type)) < 0)
return -1; return -1;
if (PyModule_AddObject(m, "spamdict", if (PyModule_AddObjectRef(m, "spamdict", (PyObject *)&spamdict_type) < 0)
Py_NewRef(&spamdict_type)) < 0)
return -1; return -1;
return 0; return 0;
} }