summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorHai Shi <shihai1992@gmail.com>2020-04-02 18:00:47 (GMT)
committerGitHub <noreply@github.com>2020-04-02 18:00:47 (GMT)
commit7a6f3bcc43ed729f8038524528c0b326b5610506 (patch)
tree2ce1e498de406c80f0415e3eb5109509f3419dde
parent45f7008a66a30cdf749ec03e580bd2692be9a8df (diff)
downloadcpython-7a6f3bcc43ed729f8038524528c0b326b5610506.zip
cpython-7a6f3bcc43ed729f8038524528c0b326b5610506.tar.gz
cpython-7a6f3bcc43ed729f8038524528c0b326b5610506.tar.bz2
bpo-1635741: Fix refleak in _locale init error handling (GH-19307)
-rw-r--r--Modules/_localemodule.c41
1 files changed, 26 insertions, 15 deletions
diff --git a/Modules/_localemodule.c b/Modules/_localemodule.c
index 0ce5dc5..5bf6638 100644
--- a/Modules/_localemodule.c
+++ b/Modules/_localemodule.c
@@ -726,40 +726,49 @@ static struct PyMethodDef PyLocale_Methods[] = {
};
static int
-_locale_exec(PyObject *m)
+_locale_exec(PyObject *module)
{
#ifdef HAVE_LANGINFO_H
int i;
#endif
+#define ADD_INT(module, value) \
+ do { \
+ if (PyModule_AddIntConstant(module, #value, value) < 0) { \
+ return -1; \
+ } \
+ } while (0)
- PyModule_AddIntMacro(m, LC_CTYPE);
- PyModule_AddIntMacro(m, LC_TIME);
- PyModule_AddIntMacro(m, LC_COLLATE);
- PyModule_AddIntMacro(m, LC_MONETARY);
+ ADD_INT(module, LC_CTYPE);
+ ADD_INT(module, LC_TIME);
+ ADD_INT(module, LC_COLLATE);
+ ADD_INT(module, LC_MONETARY);
#ifdef LC_MESSAGES
- PyModule_AddIntMacro(m, LC_MESSAGES);
+ ADD_INT(module, LC_MESSAGES);
#endif /* LC_MESSAGES */
- PyModule_AddIntMacro(m, LC_NUMERIC);
- PyModule_AddIntMacro(m, LC_ALL);
- PyModule_AddIntMacro(m, CHAR_MAX);
+ ADD_INT(module, LC_NUMERIC);
+ ADD_INT(module, LC_ALL);
+ ADD_INT(module, CHAR_MAX);
- _locale_state *state = get_locale_state(m);
+ _locale_state *state = get_locale_state(module);
state->Error = PyErr_NewException("locale.Error", NULL, NULL);
if (state->Error == NULL) {
return -1;
}
- Py_INCREF(get_locale_state(m)->Error);
- if (PyModule_AddObject(m, "Error", get_locale_state(m)->Error) < 0) {
- Py_DECREF(get_locale_state(m)->Error);
+ Py_INCREF(get_locale_state(module)->Error);
+ if (PyModule_AddObject(module, "Error", get_locale_state(module)->Error) < 0) {
+ Py_DECREF(get_locale_state(module)->Error);
return -1;
}
#ifdef HAVE_LANGINFO_H
for (i = 0; langinfo_constants[i].name; i++) {
- PyModule_AddIntConstant(m, langinfo_constants[i].name,
- langinfo_constants[i].value);
+ if (PyModule_AddIntConstant(module,
+ langinfo_constants[i].name,
+ langinfo_constants[i].value) < 0) {
+ return -1;
+ }
}
#endif
@@ -767,6 +776,8 @@ _locale_exec(PyObject *m)
return -1;
}
return 0;
+
+#undef ADD_INT
}
static struct PyModuleDef_Slot _locale_slots[] = {