]> granicus.if.org Git - python/commitdiff
Issue #18408: ste_new() initialize all attributes before handling error
authorVictor Stinner <victor.stinner@gmail.com>
Thu, 11 Jul 2013 20:49:00 +0000 (22:49 +0200)
committerVictor Stinner <victor.stinner@gmail.com>
Thu, 11 Jul 2013 20:49:00 +0000 (22:49 +0200)
If an attribute is not initialized, the destructor can crash

Python/symtable.c

index 758aefb90390def2b113be33f1c86953ea4445aa..183bf691335f1d0671a6adf32b5e6faf2d5f5939 100644 (file)
@@ -37,25 +37,13 @@ ste_new(struct symtable *st, identifier name, _Py_block_ty block,
     ste->ste_table = st;
     ste->ste_id = k; /* ste owns reference to k */
 
-    ste->ste_name = name;
     Py_INCREF(name);
+    ste->ste_name = 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_new(struct symtable *st, identifier name, _Py_block_ty block,
     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;