summaryrefslogtreecommitdiffstats
path: root/Python
diff options
context:
space:
mode:
authorNeal Norwitz <nnorwitz@gmail.com>2006-07-21 07:59:47 (GMT)
committerNeal Norwitz <nnorwitz@gmail.com>2006-07-21 07:59:47 (GMT)
commitd12bd012a6a4729b5a77c1019ca9da4e9d1b7e3e (patch)
treef80aa311a6efe044d51c07f42e734b750be129be /Python
parent33722aec5755f1fa8c0660094639174dbbeefb1d (diff)
downloadcpython-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.c6
-rw-r--r--Python/compile.c9
-rw-r--r--Python/pythonrun.c17
-rw-r--r--Python/symtable.c12
-rw-r--r--Python/thread.c2
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)