diff options
author | Victor Stinner <victor.stinner@gmail.com> | 2013-07-16 22:57:58 (GMT) |
---|---|---|
committer | Victor Stinner <victor.stinner@gmail.com> | 2013-07-16 22:57:58 (GMT) |
commit | 43d8195a704686842185b1821d2b26aa8210cc00 (patch) | |
tree | 8503f2e8c7437a3bc864ad230068f6f1de831727 /Python | |
parent | d594f24fbc4c414abd7a9dc6d3f5a60f6b72a48f (diff) | |
download | cpython-43d8195a704686842185b1821d2b26aa8210cc00.zip cpython-43d8195a704686842185b1821d2b26aa8210cc00.tar.gz cpython-43d8195a704686842185b1821d2b26aa8210cc00.tar.bz2 |
Issue #18408: Handle PyArena_AddPyObject() failure in ast.c
PyList_Append() (called by PyArena_AddPyObject()) can fail because of a
MemoryError for example.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ast.c | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/Python/ast.c b/Python/ast.c index 4d517b7..afdb199 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -560,7 +560,10 @@ new_identifier(const char *n, struct compiling *c) id = id2; } PyUnicode_InternInPlace(&id); - PyArena_AddPyObject(c->c_arena, id); + if (PyArena_AddPyObject(c->c_arena, id) < 0) { + Py_DECREF(id); + return NULL; + } return id; } @@ -1847,7 +1850,10 @@ ast_for_atom(struct compiling *c, const node *n) } return NULL; } - PyArena_AddPyObject(c->c_arena, str); + if (PyArena_AddPyObject(c->c_arena, str) < 0) { + Py_DECREF(str); + return NULL; + } if (bytesmode) return Bytes(str, LINENO(n), n->n_col_offset, c->c_arena); else @@ -1858,7 +1864,10 @@ ast_for_atom(struct compiling *c, const node *n) if (!pynum) return NULL; - PyArena_AddPyObject(c->c_arena, pynum); + if (PyArena_AddPyObject(c->c_arena, pynum) < 0) { + Py_DECREF(pynum); + return NULL; + } return Num(pynum, LINENO(n), n->n_col_offset, c->c_arena); } case ELLIPSIS: /* Ellipsis */ @@ -2845,13 +2854,19 @@ alias_for_import_name(struct compiling *c, const node *n, int store) return NULL; str = uni; PyUnicode_InternInPlace(&str); - PyArena_AddPyObject(c->c_arena, str); + if (PyArena_AddPyObject(c->c_arena, str) < 0) { + Py_DECREF(str); + return NULL; + } return alias(str, NULL, c->c_arena); } break; case STAR: str = PyUnicode_InternFromString("*"); - PyArena_AddPyObject(c->c_arena, str); + if (PyArena_AddPyObject(c->c_arena, str) < 0) { + Py_DECREF(str); + return NULL; + } return alias(str, NULL, c->c_arena); default: PyErr_Format(PyExc_SystemError, |