summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorVictor Stinner <vstinner@python.org>2023-08-23 21:12:08 (GMT)
committerGitHub <noreply@github.com>2023-08-23 21:12:08 (GMT)
commitec3527d19627e62212f792513e6cab62b6f0f46a (patch)
tree608989156b21ece6e10305e702ac55d5cb42048c /Python
parent4dc9f4893084f7c3acf78a0384620cd44f604a0d (diff)
downloadcpython-ec3527d19627e62212f792513e6cab62b6f0f46a.zip
cpython-ec3527d19627e62212f792513e6cab62b6f0f46a.tar.gz
cpython-ec3527d19627e62212f792513e6cab62b6f0f46a.tar.bz2
gh-108308: config_dict_get() uses PyDict_GetItemRef() (#108371)
Replace _PyDict_GetItemStringWithError() with PyDict_GetItemRef() in config_dict_get() to get a strong reference to the item.
Diffstat (limited to 'Python')
-rw-r--r--Python/initconfig.c25
1 files changed, 19 insertions, 6 deletions
diff --git a/Python/initconfig.c b/Python/initconfig.c
index c017abe..39d21ad 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 @@ fail:
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;
}