]> granicus.if.org Git - python/commitdiff
SF #1445431, fix some leaks in error conditions.
authorNeal Norwitz <nnorwitz@gmail.com>
Mon, 20 Mar 2006 04:08:12 +0000 (04:08 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Mon, 20 Mar 2006 04:08:12 +0000 (04:08 +0000)
Modules/parsermodule.c
Modules/posixmodule.c

index 83165ba8a68d45b62ceb7fbe775e328877315c89..3a886b40994ab7ebb77bacaceb78f5abdf671e10 100644 (file)
@@ -657,9 +657,10 @@ build_node_children(PyObject *tuple, node *root, int *line_num)
             }
         }
         if (!ok) {
-            PyErr_SetObject(parser_error,
-                            Py_BuildValue("os", elem,
-                                          "Illegal node construct."));
+            PyObject *err = Py_BuildValue("os", elem,
+                                          "Illegal node construct.");
+            PyErr_SetObject(parser_error, err);
+            Py_XDECREF(err);
             Py_XDECREF(elem);
             return (0);
         }
@@ -710,8 +711,9 @@ build_node_children(PyObject *tuple, node *root, int *line_num)
              *  It has to be one or the other; this is an error.
              *  Throw an exception.
              */
-            PyErr_SetObject(parser_error,
-                            Py_BuildValue("os", elem, "unknown node type."));
+            PyObject *err = Py_BuildValue("os", elem, "unknown node type.");
+            PyErr_SetObject(parser_error, err);
+            Py_XDECREF(err);
             Py_XDECREF(elem);
             return (0);
         }
@@ -762,6 +764,7 @@ build_node_tree(PyObject *tuple)
         tuple = Py_BuildValue("os", tuple,
                     "Illegal syntax-tree; cannot start with terminal symbol.");
         PyErr_SetObject(parser_error, tuple);
+        Py_XDECREF(tuple);
     }
     else if (ISNONTERMINAL(num)) {
         /*
@@ -792,14 +795,16 @@ build_node_tree(PyObject *tuple)
             }
         }
     }
-    else
+    else {
         /*  The tuple is illegal -- if the number is neither TERMINAL nor
          *  NONTERMINAL, we can't use it.  Not sure the implementation
          *  allows this condition, but the API doesn't preclude it.
          */
-        PyErr_SetObject(parser_error,
-                        Py_BuildValue("os", tuple,
-                                      "Illegal component tuple."));
+        PyObject *err = Py_BuildValue("os", tuple,
+                                      "Illegal component tuple.");
+        PyErr_SetObject(parser_error, err);
+        Py_XDECREF(err);
+    }
 
     return (res);
 }
index 1fbc3530088ec9c58539f1b1227d1879e0714621..116b66b7b7e8ab5a3b979fe60e2e5e507ccfbd2d 100644 (file)
@@ -6396,15 +6396,16 @@ posix_tmpnam(PyObject *self, PyObject *noargs)
     name = tmpnam(buffer);
 #endif
     if (name == NULL) {
-        PyErr_SetObject(PyExc_OSError,
-                        Py_BuildValue("is", 0,
+       PyObject *err = Py_BuildValue("is", 0,
 #ifdef USE_TMPNAM_R
                                       "unexpected NULL from tmpnam_r"
 #else
                                       "unexpected NULL from tmpnam"
 #endif
-                                      ));
-        return NULL;
+                                      );
+       PyErr_SetObject(PyExc_OSError, err);
+       Py_XDECREF(err);
+       return NULL;
     }
     return PyString_FromString(buffer);
 }