Issue #18408: ste_new() initialize all attributes before handling error

If an attribute is not initialized, the destructor can crash
This commit is contained in:
Victor Stinner 2013-07-11 22:49:00 +02:00
parent 2e8474ddde
commit 9a4fb66966
1 changed files with 9 additions and 13 deletions

View 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;