]> granicus.if.org Git - python/commitdiff
Add NULL checks to the initializer of the locale module
authorChristian Heimes <christian@python.org>
Thu, 8 Sep 2016 22:24:12 +0000 (00:24 +0200)
committerChristian Heimes <christian@python.org>
Thu, 8 Sep 2016 22:24:12 +0000 (00:24 +0200)
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

Modules/_localemodule.c

index a92fb10dd26c83d03b77ded81af9d9c7293035aa..8259180f823850d7f10a0db1adf081aba4c6b02d 100644 (file)
@@ -621,53 +621,34 @@ static struct PyModuleDef _localemodule = {
 PyMODINIT_FUNC
 PyInit__locale(void)
 {
-    PyObject *m, *d, *x;
+    PyObject *m;
 #ifdef HAVE_LANGINFO_H
     int i;
 #endif
 
     m = PyModule_Create(&_localemodule);
     if (m == NULL)
-    return NULL;
-
-    d = PyModule_GetDict(m);
-
-    x = PyLong_FromLong(LC_CTYPE);
-    PyDict_SetItemString(d, "LC_CTYPE", x);
-    Py_XDECREF(x);
-
-    x = PyLong_FromLong(LC_TIME);
-    PyDict_SetItemString(d, "LC_TIME", x);
-    Py_XDECREF(x);
-
-    x = PyLong_FromLong(LC_COLLATE);
-    PyDict_SetItemString(d, "LC_COLLATE", x);
-    Py_XDECREF(x);
+        return NULL;
 
-    x = PyLong_FromLong(LC_MONETARY);
-    PyDict_SetItemString(d, "LC_MONETARY", x);
-    Py_XDECREF(x);
+    PyModule_AddIntMacro(m, LC_CTYPE);
+    PyModule_AddIntMacro(m, LC_TIME);
+    PyModule_AddIntMacro(m, LC_COLLATE);
+    PyModule_AddIntMacro(m, LC_MONETARY);
 
 #ifdef LC_MESSAGES
-    x = PyLong_FromLong(LC_MESSAGES);
-    PyDict_SetItemString(d, "LC_MESSAGES", x);
-    Py_XDECREF(x);
+    PyModule_AddIntMacro(m, LC_MESSAGES);
 #endif /* LC_MESSAGES */
 
-    x = PyLong_FromLong(LC_NUMERIC);
-    PyDict_SetItemString(d, "LC_NUMERIC", x);
-    Py_XDECREF(x);
-
-    x = PyLong_FromLong(LC_ALL);
-    PyDict_SetItemString(d, "LC_ALL", x);
-    Py_XDECREF(x);
-
-    x = PyLong_FromLong(CHAR_MAX);
-    PyDict_SetItemString(d, "CHAR_MAX", x);
-    Py_XDECREF(x);
+    PyModule_AddIntMacro(m, LC_NUMERIC);
+    PyModule_AddIntMacro(m, LC_ALL);
+    PyModule_AddIntMacro(m, CHAR_MAX);
 
     Error = PyErr_NewException("locale.Error", NULL, NULL);
-    PyDict_SetItemString(d, "Error", Error);
+    if (Error == NULL) {
+        Py_DECREF(m);
+        return NULL;
+    }
+    PyModule_AddObject(m, "Error", Error);
 
 #ifdef HAVE_LANGINFO_H
     for (i = 0; langinfo_constants[i].name; i++) {
@@ -675,6 +656,11 @@ PyInit__locale(void)
                                 langinfo_constants[i].value);
     }
 #endif
+
+    if (PyErr_Occurred()) {
+        Py_DECREF(m);
+        return NULL;
+    }
     return m;
 }