Mercurial > cpython-lru_cache-weakref
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;
