diff Python/symtable.c @ 84562:39eb1ce5f377

Issue #18408: ste_new() initialize all attributes before handling error If an attribute is not initialized, the destructor can crash
author Victor Stinner <victor.stinner@gmail.com>
date Thu, 11 Jul 2013 22:49:00 +0200
parents 8bcdd2343bf5
children df2fdd42b375
line wrap: on
line diff
--- a/Python/symtable.c	Thu Jul 11 22:46:11 2013 +0200
+++ b/Python/symtable.c	Thu Jul 11 22:49:00 2013 +0200
@@ -37,25 +37,13 @@
     ste->ste_table = st;
     ste->ste_id = k; /* ste owns reference to k */
 
+    Py_INCREF(name);
     ste->ste_name = name;
-    Py_INCREF(name);
 
     ste->ste_symbols = NULL;
     ste->ste_varnames = NULL;
     ste->ste_children = NULL;
 
-    ste->ste_symbols = PyDict_New();
-    if (ste->ste_symbols == NULL)
-        goto fail;
-
-    ste->ste_varnames = PyList_New(0);
-    if (ste->ste_varnames == NULL)
-        goto fail;
-
-    ste->ste_children = PyList_New(0);
-    if (ste->ste_children == NULL)
-        goto fail;
-
     ste->ste_directives = NULL;
 
     ste->ste_type = block;
@@ -79,6 +67,14 @@
     ste->ste_returns_value = 0;
     ste->ste_needs_class_closure = 0;
 
+    ste->ste_symbols = PyDict_New();
+    ste->ste_varnames = PyList_New(0);
+    ste->ste_children = PyList_New(0);
+    if (ste->ste_symbols == NULL
+        || ste->ste_varnames == NULL
+        || ste->ste_children == NULL)
+        goto fail;
+
     if (PyDict_SetItem(st->st_blocks, ste->ste_id, (PyObject *)ste) < 0)
         goto fail;