diff options
author | Neal Norwitz <nnorwitz@gmail.com> | 2006-07-21 07:59:47 (GMT) |
---|---|---|
committer | Neal Norwitz <nnorwitz@gmail.com> | 2006-07-21 07:59:47 (GMT) |
commit | d12bd012a6a4729b5a77c1019ca9da4e9d1b7e3e (patch) | |
tree | f80aa311a6efe044d51c07f42e734b750be129be /Python | |
parent | 33722aec5755f1fa8c0660094639174dbbeefb1d (diff) | |
download | cpython-d12bd012a6a4729b5a77c1019ca9da4e9d1b7e3e.zip cpython-d12bd012a6a4729b5a77c1019ca9da4e9d1b7e3e.tar.gz cpython-d12bd012a6a4729b5a77c1019ca9da4e9d1b7e3e.tar.bz2 |
Handle more memory allocation failures without crashing.
Diffstat (limited to 'Python')
-rw-r--r-- | Python/ast.c | 6 | ||||
-rw-r--r-- | Python/compile.c | 9 | ||||
-rw-r--r-- | Python/pythonrun.c | 17 | ||||
-rw-r--r-- | Python/symtable.c | 12 | ||||
-rw-r--r-- | Python/thread.c | 2 |
5 files changed, 38 insertions, 8 deletions
diff --git a/Python/ast.c b/Python/ast.c index d00fcc8..9180fd0 100644 --- a/Python/ast.c +++ b/Python/ast.c @@ -638,8 +638,10 @@ ast_for_arguments(struct compiling *c, const node *n) anything other than EQUAL or a comma? */ /* XXX Should NCH(n) check be made a separate check? */ if (i + 1 < NCH(n) && TYPE(CHILD(n, i + 1)) == EQUAL) { - asdl_seq_SET(defaults, j++, - ast_for_expr(c, CHILD(n, i + 2))); + expr_ty expression = ast_for_expr(c, CHILD(n, i + 2)); + if (!expression) + goto error; + asdl_seq_SET(defaults, j++, expression); i += 2; found_default = 1; } diff --git a/Python/compile.c b/Python/compile.c index 8341cc9..3ee5cbb 100644 --- a/Python/compile.c +++ b/Python/compile.c @@ -1105,8 +1105,17 @@ compiler_enter_scope(struct compiler *c, identifier name, void *key, u->u_name = name; u->u_varnames = list2dict(u->u_ste->ste_varnames); u->u_cellvars = dictbytype(u->u_ste->ste_symbols, CELL, 0, 0); + if (!u->u_varnames || !u->u_cellvars) { + compiler_unit_free(u); + return 0; + } + u->u_freevars = dictbytype(u->u_ste->ste_symbols, FREE, DEF_FREE_CLASS, PyDict_Size(u->u_cellvars)); + if (!u->u_freevars) { + compiler_unit_free(u); + return 0; + } u->u_blocks = NULL; u->u_tmpname = 0; diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 95a3372..bc83219 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1204,8 +1204,12 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals, { PyObject *ret = NULL; PyArena *arena = PyArena_New(); - mod_ty mod = PyParser_ASTFromString(str, "<string>", start, flags, - arena); + mod_ty mod; + + if (arena == NULL) + return NULL; + + mod = PyParser_ASTFromString(str, "<string>", start, flags, arena); if (mod != NULL) ret = run_mod(mod, "<string>", globals, locals, flags, arena); PyArena_Free(arena); @@ -1218,8 +1222,13 @@ PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals, { PyObject *ret; PyArena *arena = PyArena_New(); - mod_ty mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, - flags, NULL, arena); + mod_ty mod; + + if (arena == NULL) + return NULL; + + mod = PyParser_ASTFromFile(fp, filename, start, 0, 0, + flags, NULL, arena); if (mod == NULL) { PyArena_Free(arena); return NULL; diff --git a/Python/symtable.c b/Python/symtable.c index 1dc2a2e..fae9208 100644 --- a/Python/symtable.c +++ b/Python/symtable.c @@ -221,8 +221,12 @@ PySymtable_Build(mod_ty mod, const char *filename, PyFutureFeatures *future) return st; st->st_filename = filename; st->st_future = future; - symtable_enter_block(st, GET_IDENTIFIER(top), ModuleBlock, - (void *)mod, 0); + if (!symtable_enter_block(st, GET_IDENTIFIER(top), ModuleBlock, + (void *)mod, 0)) { + PySymtable_Free(st); + return NULL; + } + st->st_top = st->st_cur; st->st_cur->ste_unoptimized = OPT_TOPLEVEL; /* Any other top-level initialization? */ @@ -728,6 +732,8 @@ symtable_exit_block(struct symtable *st, void *ast) if (end >= 0) { st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack, end); + if (st->st_cur == NULL) + return 0; Py_INCREF(st->st_cur); if (PySequence_DelItem(st->st_stack, end) < 0) return 0; @@ -749,6 +755,8 @@ symtable_enter_block(struct symtable *st, identifier name, _Py_block_ty block, Py_DECREF(st->st_cur); } st->st_cur = PySTEntry_New(st, name, block, ast, lineno); + if (st->st_cur == NULL) + return 0; if (name == GET_IDENTIFIER(top)) st->st_global = st->st_cur->ste_symbols; if (prev) { diff --git a/Python/thread.c b/Python/thread.c index bc501822..3a2c7af 100644 --- a/Python/thread.c +++ b/Python/thread.c @@ -267,6 +267,8 @@ find_key(int key, void *value) struct key *p; long id = PyThread_get_thread_ident(); + if (!keymutex) + return NULL; PyThread_acquire_lock(keymutex, 1); for (p = keyhead; p != NULL; p = p->next) { if (p->id == id && p->key == key) |