Skip to content

Commit ff4fddd

Browse files
committed
Add NULL checks to the initializer of the locale module
The _locale module was using old-style APIs to set numeric module constants from macros. The new way requires less code and properly checks for NULL. CID 1295027
1 parent 45af0c8 commit ff4fddd

File tree

1 file changed

+20
-34
lines changed

1 file changed

+20
-34
lines changed

Modules/_localemodule.c

Lines changed: 20 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -621,60 +621,46 @@ static struct PyModuleDef _localemodule = {
621621
PyMODINIT_FUNC
622622
PyInit__locale(void)
623623
{
624-
PyObject *m, *d, *x;
624+
PyObject *m;
625625
#ifdef HAVE_LANGINFO_H
626626
int i;
627627
#endif
628628

629629
m = PyModule_Create(&_localemodule);
630630
if (m == NULL)
631-
return NULL;
632-
633-
d = PyModule_GetDict(m);
634-
635-
x = PyLong_FromLong(LC_CTYPE);
636-
PyDict_SetItemString(d, "LC_CTYPE", x);
637-
Py_XDECREF(x);
638-
639-
x = PyLong_FromLong(LC_TIME);
640-
PyDict_SetItemString(d, "LC_TIME", x);
641-
Py_XDECREF(x);
642-
643-
x = PyLong_FromLong(LC_COLLATE);
644-
PyDict_SetItemString(d, "LC_COLLATE", x);
645-
Py_XDECREF(x);
631+
return NULL;
646632

647-
x = PyLong_FromLong(LC_MONETARY);
648-
PyDict_SetItemString(d, "LC_MONETARY", x);
649-
Py_XDECREF(x);
633+
PyModule_AddIntMacro(m, LC_CTYPE);
634+
PyModule_AddIntMacro(m, LC_TIME);
635+
PyModule_AddIntMacro(m, LC_COLLATE);
636+
PyModule_AddIntMacro(m, LC_MONETARY);
650637

651638
#ifdef LC_MESSAGES
652-
x = PyLong_FromLong(LC_MESSAGES);
653-
PyDict_SetItemString(d, "LC_MESSAGES", x);
654-
Py_XDECREF(x);
639+
PyModule_AddIntMacro(m, LC_MESSAGES);
655640
#endif /* LC_MESSAGES */
656641

657-
x = PyLong_FromLong(LC_NUMERIC);
658-
PyDict_SetItemString(d, "LC_NUMERIC", x);
659-
Py_XDECREF(x);
660-
661-
x = PyLong_FromLong(LC_ALL);
662-
PyDict_SetItemString(d, "LC_ALL", x);
663-
Py_XDECREF(x);
664-
665-
x = PyLong_FromLong(CHAR_MAX);
666-
PyDict_SetItemString(d, "CHAR_MAX", x);
667-
Py_XDECREF(x);
642+
PyModule_AddIntMacro(m, LC_NUMERIC);
643+
PyModule_AddIntMacro(m, LC_ALL);
644+
PyModule_AddIntMacro(m, CHAR_MAX);
668645

669646
Error = PyErr_NewException("locale.Error", NULL, NULL);
670-
PyDict_SetItemString(d, "Error", Error);
647+
if (Error == NULL) {
648+
Py_DECREF(m);
649+
return NULL;
650+
}
651+
PyModule_AddObject(m, "Error", Error);
671652

672653
#ifdef HAVE_LANGINFO_H
673654
for (i = 0; langinfo_constants[i].name; i++) {
674655
PyModule_AddIntConstant(m, langinfo_constants[i].name,
675656
langinfo_constants[i].value);
676657
}
677658
#endif
659+
660+
if (PyErr_Occurred()) {
661+
Py_DECREF(m);
662+
return NULL;
663+
}
678664
return m;
679665
}
680666

0 commit comments

Comments
 (0)