diff --git a/Python/initconfig.c b/Python/initconfig.c index c017abeb90563e..39d21adf546466 100644 --- a/Python/initconfig.c +++ b/Python/initconfig.c @@ -1,5 +1,4 @@ #include "Python.h" -#include "pycore_dict.h" // _PyDict_GetItemStringWithError() #include "pycore_fileutils.h" // _Py_HasFileSystemDefaultEncodeErrors #include "pycore_getopt.h" // _PyOS_GetOpt() #include "pycore_initconfig.h" // _PyStatus_OK() @@ -1065,8 +1064,11 @@ _PyConfig_AsDict(const PyConfig *config) static PyObject* config_dict_get(PyObject *dict, const char *name) { - PyObject *item = _PyDict_GetItemStringWithError(dict, name); - if (item == NULL && !PyErr_Occurred()) { + PyObject *item; + if (PyDict_GetItemStringRef(dict, name, &item) < 0) { + return NULL; + } + if (item == NULL) { PyErr_Format(PyExc_ValueError, "missing config key: %s", name); return NULL; } @@ -1096,6 +1098,7 @@ config_dict_get_int(PyObject *dict, const char *name, int *result) return -1; } int value = _PyLong_AsInt(item); + Py_DECREF(item); if (value == -1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_TypeError)) { config_dict_invalid_type(name); @@ -1118,6 +1121,7 @@ config_dict_get_ulong(PyObject *dict, const char *name, unsigned long *result) return -1; } unsigned long value = PyLong_AsUnsignedLong(item); + Py_DECREF(item); if (value == (unsigned long)-1 && PyErr_Occurred()) { if (PyErr_ExceptionMatches(PyExc_TypeError)) { config_dict_invalid_type(name); @@ -1140,27 +1144,33 @@ config_dict_get_wstr(PyObject *dict, const char *name, PyConfig *config, if (item == NULL) { return -1; } + PyStatus status; if (item == Py_None) { status = PyConfig_SetString(config, result, NULL); } else if (!PyUnicode_Check(item)) { config_dict_invalid_type(name); - return -1; + goto error; } else { wchar_t *wstr = PyUnicode_AsWideCharString(item, NULL); if (wstr == NULL) { - return -1; + goto error; } status = PyConfig_SetString(config, result, wstr); PyMem_Free(wstr); } if (_PyStatus_EXCEPTION(status)) { PyErr_NoMemory(); - return -1; + goto error; } + Py_DECREF(item); return 0; + +error: + Py_DECREF(item); + return -1; } @@ -1174,6 +1184,7 @@ config_dict_get_wstrlist(PyObject *dict, const char *name, PyConfig *config, } if (!PyList_CheckExact(list)) { + Py_DECREF(list); config_dict_invalid_type(name); return -1; } @@ -1207,10 +1218,12 @@ config_dict_get_wstrlist(PyObject *dict, const char *name, PyConfig *config, goto error; } _PyWideStringList_Clear(&wstrlist); + Py_DECREF(list); return 0; error: _PyWideStringList_Clear(&wstrlist); + Py_DECREF(list); return -1; }