]> granicus.if.org Git - python/commitdiff
Handle failure from PyModule_GetDict() (Klocwork 208).
authorNeal Norwitz <nnorwitz@gmail.com>
Sun, 13 Aug 2006 18:12:45 +0000 (18:12 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Sun, 13 Aug 2006 18:12:45 +0000 (18:12 +0000)
Fix a bunch of refleaks in the init of the module.  This would only be found
when running python -v.

Modules/_cursesmodule.c

index ec55c8ed2319ca5c5546baaa2a17db7420b47226..2921d53a8f574549f3ed56550d4b08fb75721cac 100644 (file)
@@ -1784,7 +1784,6 @@ static PyObject *
 PyCurses_InitScr(PyObject *self)
 {
   WINDOW *win;
-  PyObject *nlines, *cols;
 
   if (initialised == TRUE) {
     wrefresh(stdscr);
@@ -1803,7 +1802,12 @@ PyCurses_InitScr(PyObject *self)
 /* This was moved from initcurses() because it core dumped on SGI,
    where they're not defined until you've called initscr() */
 #define SetDictInt(string,ch) \
-       PyDict_SetItemString(ModDict,string,PyInt_FromLong((long) (ch)));
+    do {                                                       \
+       PyObject *o = PyInt_FromLong((long) (ch));              \
+       if (o && PyDict_SetItemString(ModDict, string, o) == 0) { \
+           Py_DECREF(o);                                       \
+       }                                                       \
+    } while (0)
 
        /* Here are some graphic symbols you can use */
         SetDictInt("ACS_ULCORNER",      (ACS_ULCORNER));
@@ -1872,12 +1876,8 @@ PyCurses_InitScr(PyObject *self)
        SetDictInt("ACS_STERLING",      (ACS_STERLING));
 #endif
 
-  nlines = PyInt_FromLong((long) LINES);
-  PyDict_SetItemString(ModDict, "LINES", nlines);
-  Py_DECREF(nlines);
-  cols = PyInt_FromLong((long) COLS);
-  PyDict_SetItemString(ModDict, "COLS", cols);
-  Py_DECREF(cols);
+  SetDictInt("LINES", LINES);
+  SetDictInt("COLS", COLS);
 
   return (PyObject *)PyCursesWindow_New(win);
 }
@@ -2554,6 +2554,8 @@ init_curses(void)
 
        /* Add some symbolic constants to the module */
        d = PyModule_GetDict(m);
+       if (d == NULL)
+               return;
        ModDict = d; /* For PyCurses_InitScr to use later */
 
        /* Add a CObject for the C API */
@@ -2667,6 +2669,10 @@ init_curses(void)
            if (strncmp(key_n,"KEY_F(",6)==0) {
              char *p1, *p2;
              key_n2 = malloc(strlen(key_n)+1);
+             if (!key_n2) {
+               PyErr_NoMemory();
+               break;
+              }
              p1 = key_n;
              p2 = key_n2;
              while (*p1) {
@@ -2679,7 +2685,7 @@ init_curses(void)
              *p2 = (char)0;
            } else
              key_n2 = key_n;
-           PyDict_SetItemString(d,key_n2,PyInt_FromLong((long) key));
+           SetDictInt(key_n2,key);
            if (key_n2 != key_n)
              free(key_n2);
          }