[Python-checkins] cpython: Issue #18408: ste_new() initialize all attributes before handling error

victor.stinner python-checkins at python.org
Thu Jul 11 23:12:09 CEST 2013


http://hg.python.org/cpython/rev/39eb1ce5f377
changeset:   84562:39eb1ce5f377
user:        Victor Stinner <victor.stinner at gmail.com>
date:        Thu Jul 11 22:49:00 2013 +0200
summary:
  Issue #18408: ste_new() initialize all attributes before handling error

If an attribute is not initialized, the destructor can crash

files:
  Python/symtable.c |  22 +++++++++-------------
  1 files changed, 9 insertions(+), 13 deletions(-)


diff --git a/Python/symtable.c b/Python/symtable.c
--- a/Python/symtable.c
+++ b/Python/symtable.c
@@ -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;
 

-- 
Repository URL: http://hg.python.org/cpython


More information about the Python-checkins mailing list