(original) (raw)
changeset: 84562:39eb1ce5f377 user: Victor Stinner victor.stinner@gmail.com date: Thu Jul 11 22:49:00 2013 +0200 files: Python/symtable.c description: Issue #18408: ste_new() initialize all attributes before handling error If an attribute is not initialized, the destructor can crash diff -r 01a46dc00fc8 -r 39eb1ce5f377 Python/symtable.c --- 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; /victor.stinner@gmail.com