]> granicus.if.org Git - python/commitdiff
Fix more memory allocation issues found with failmalloc.
authorNeal Norwitz <nnorwitz@gmail.com>
Sat, 22 Jul 2006 16:20:49 +0000 (16:20 +0000)
committerNeal Norwitz <nnorwitz@gmail.com>
Sat, 22 Jul 2006 16:20:49 +0000 (16:20 +0000)
Modules/bz2module.c
Modules/cPickle.c
Python/compile.c
Python/pyarena.c
Python/pythonrun.c
Python/symtable.c

index 5800bff86e92f591d3387847784b5988d13b06bb..5e5a801907d8362f97bd2bee7d12dc05fc54246a 100644 (file)
@@ -1348,8 +1348,10 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
 
 #ifdef WITH_THREAD
        self->lock = PyThread_allocate_lock();
-       if (!self->lock)
+       if (!self->lock) {
+               PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
                goto error;
+       }
 #endif
 
        if (mode_char == 'r')
@@ -1371,10 +1373,12 @@ BZ2File_init(BZ2FileObject *self, PyObject *args, PyObject *kwargs)
        return 0;
 
 error:
-       Py_DECREF(self->file);
+       Py_CLEAR(self->file);
 #ifdef WITH_THREAD
-       if (self->lock)
+       if (self->lock) {
                PyThread_free_lock(self->lock);
+               self->lock = NULL;
+       }
 #endif
        return -1;
 }
@@ -1682,8 +1686,10 @@ BZ2Comp_init(BZ2CompObject *self, PyObject *args, PyObject *kwargs)
 
 #ifdef WITH_THREAD
        self->lock = PyThread_allocate_lock();
-       if (!self->lock)
+       if (!self->lock) {
+               PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
                goto error;
+       }
 #endif
 
        memset(&self->bzs, 0, sizeof(bz_stream));
@@ -1698,8 +1704,10 @@ BZ2Comp_init(BZ2CompObject *self, PyObject *args, PyObject *kwargs)
        return 0;
 error:
 #ifdef WITH_THREAD
-       if (self->lock)
+       if (self->lock) {
                PyThread_free_lock(self->lock);
+               self->lock = NULL;
+       }
 #endif
        return -1;
 }
@@ -1894,8 +1902,10 @@ BZ2Decomp_init(BZ2DecompObject *self, PyObject *args, PyObject *kwargs)
 
 #ifdef WITH_THREAD
        self->lock = PyThread_allocate_lock();
-       if (!self->lock)
+       if (!self->lock) {
+               PyErr_SetString(PyExc_MemoryError, "unable to allocate lock");
                goto error;
+       }
 #endif
 
        self->unused_data = PyString_FromString("");
@@ -1915,10 +1925,12 @@ BZ2Decomp_init(BZ2DecompObject *self, PyObject *args, PyObject *kwargs)
 
 error:
 #ifdef WITH_THREAD
-       if (self->lock)
+       if (self->lock) {
                PyThread_free_lock(self->lock);
+               self->lock = NULL;
+       }
 #endif
-       Py_XDECREF(self->unused_data);
+       Py_CLEAR(self->unused_data);
        return -1;
 }
 
index 6b9b322247ec3e820115e77fa8d023fb17eddc8a..56f23351fb6f4fae79d1f8535ff7920eaf0e9385 100644 (file)
@@ -196,7 +196,7 @@ Pdata_clear(Pdata *self, int clearto)
        for (i = self->length, p = self->data + clearto;
             --i >= clearto;
             p++) {
-               Py_DECREF(*p);
+               Py_CLEAR(*p);
        }
        self->length = clearto;
 
@@ -208,6 +208,7 @@ Pdata_grow(Pdata *self)
 {
        int bigger;
        size_t nbytes;
+       PyObject **tmp;
 
        bigger = self->size << 1;
        if (bigger <= 0)        /* was 0, or new value overflows */
@@ -217,14 +218,14 @@ Pdata_grow(Pdata *self)
        nbytes = (size_t)bigger * sizeof(PyObject *);
        if (nbytes / sizeof(PyObject *) != (size_t)bigger)
                goto nomemory;
-       self->data = realloc(self->data, nbytes);
-       if (self->data == NULL)
+       tmp = realloc(self->data, nbytes);
+       if (tmp == NULL)
                goto nomemory;
+       self->data = tmp;
        self->size = bigger;
        return 0;
 
   nomemory:
-       self->size = 0;
        PyErr_NoMemory();
        return -1;
 }
@@ -4163,6 +4164,7 @@ do_append(Unpicklerobject *self, int  x)
                int list_len;
 
                slice=Pdata_popList(self->stack, x);
+               if (! slice) return -1;
                list_len = PyList_GET_SIZE(list);
                i=PyList_SetSlice(list, list_len, list_len, slice);
                Py_DECREF(slice);
@@ -5167,6 +5169,9 @@ newUnpicklerobject(PyObject *f)
        if (!( self->memo = PyDict_New()))
                goto err;
 
+       if (!self->stack)
+               goto err;
+
        Py_INCREF(f);
        self->file = f;
 
index 3ee5cbbd6e93e21be45e910d3040522772697c70..564df18473584ee817bd5ece2233e68ab591d769 100644 (file)
@@ -300,8 +300,11 @@ PyCodeObject *
 PyNode_Compile(struct _node *n, const char *filename)
 {
        PyCodeObject *co = NULL;
+       mod_ty mod;
        PyArena *arena = PyArena_New();
-       mod_ty mod = PyAST_FromNode(n, NULL, filename, arena);
+       if (!arena)
+               return NULL;
+       mod = PyAST_FromNode(n, NULL, filename, arena);
        if (mod)
                co = PyAST_Compile(mod, filename, NULL, arena);
        PyArena_Free(arena);
@@ -615,8 +618,10 @@ markblocks(unsigned char *code, int len)
        unsigned int *blocks = (unsigned int *)PyMem_Malloc(len*sizeof(int));
        int i,j, opcode, blockcnt = 0;
 
-       if (blocks == NULL)
+       if (blocks == NULL) {
+               PyErr_NoMemory();
                return NULL;
+       }
        memset(blocks, 0, len*sizeof(int));
 
        /* Mark labels in the first pass */
@@ -1071,14 +1076,14 @@ compiler_unit_free(struct compiler_unit *u)
                PyObject_Free((void *)b);
                b = next;
        }
-       Py_XDECREF(u->u_ste);
-       Py_XDECREF(u->u_name);
-       Py_XDECREF(u->u_consts);
-       Py_XDECREF(u->u_names);
-       Py_XDECREF(u->u_varnames);
-       Py_XDECREF(u->u_freevars);
-       Py_XDECREF(u->u_cellvars);
-       Py_XDECREF(u->u_private);
+       Py_CLEAR(u->u_ste);
+       Py_CLEAR(u->u_name);
+       Py_CLEAR(u->u_consts);
+       Py_CLEAR(u->u_names);
+       Py_CLEAR(u->u_varnames);
+       Py_CLEAR(u->u_freevars);
+       Py_CLEAR(u->u_cellvars);
+       Py_CLEAR(u->u_private);
        PyObject_Free(u);
 }
 
@@ -1139,7 +1144,8 @@ compiler_enter_scope(struct compiler *c, identifier name, void *key,
        /* Push the old compiler_unit on the stack. */
        if (c->u) {
                PyObject *wrapper = PyCObject_FromVoidPtr(c->u, NULL);
-               if (PyList_Append(c->c_stack, wrapper) < 0) {
+               if (!wrapper || PyList_Append(c->c_stack, wrapper) < 0) {
+                       Py_XDECREF(wrapper);
                        compiler_unit_free(u);
                        return 0;
                }
@@ -1265,6 +1271,7 @@ compiler_next_instr(struct compiler *c, basicblock *b)
                       sizeof(struct instr) * DEFAULT_BLOCK_SIZE);
        }
        else if (b->b_iused == b->b_ialloc) {
+               struct instr *tmp;
                size_t oldsize, newsize;
                oldsize = b->b_ialloc * sizeof(struct instr);
                newsize = oldsize << 1;
@@ -1273,10 +1280,13 @@ compiler_next_instr(struct compiler *c, basicblock *b)
                        return -1;
                }
                b->b_ialloc <<= 1;
-               b->b_instr = (struct instr *)PyObject_Realloc(
+               tmp = (struct instr *)PyObject_Realloc(
                                                 (void *)b->b_instr, newsize);
-               if (b->b_instr == NULL)
+               if (tmp == NULL) {
+                       PyErr_NoMemory();
                        return -1;
+               }
+               b->b_instr = tmp;
                memset((char *)b->b_instr + oldsize, 0, newsize - oldsize);
        }
        return b->b_iused++;
index f11a90546b67491206e1b4b223e89391d583c3fd..f4cc474f412166e7625fd5fba683bcfb63b2ad72 100644 (file)
@@ -132,19 +132,19 @@ PyArena_New()
 {
        PyArena* arena = (PyArena *)malloc(sizeof(PyArena));
        if (!arena)
-               return NULL;
+               return (PyArena*)PyErr_NoMemory();
 
        arena->a_head = block_new(DEFAULT_BLOCK_SIZE);
        arena->a_cur = arena->a_head;
         if (!arena->a_head) {
                 free((void *)arena);
-                return NULL;
+                return (PyArena*)PyErr_NoMemory();
         }
         arena->a_objects = PyList_New(0);
         if (!arena->a_objects) {
                 block_free(arena->a_head);
                 free((void *)arena);
-                return NULL;
+                return (PyArena*)PyErr_NoMemory();
         }
 #if defined(Py_DEBUG)
         arena->total_allocs = 0;
@@ -191,7 +191,7 @@ PyArena_Malloc(PyArena *arena, size_t size)
 {
        void *p = block_alloc(arena->a_cur, size);
        if (!p)
-               return NULL;
+               return PyErr_NoMemory();
 #if defined(Py_DEBUG)
         arena->total_allocs++;
         arena->total_size += size;
index bc832195ecb0692b9f0953ac7d7da1f00e081f19..88fd67c1e57ac19b1687b5229700e85a84342e64 100644 (file)
@@ -746,6 +746,11 @@ PyRun_InteractiveOneFlags(FILE *fp, const char *filename, PyCompilerFlags *flags
                        ps2 = PyString_AsString(w);
        }
        arena = PyArena_New();
+       if (arena == NULL) {
+               Py_XDECREF(v);
+               Py_XDECREF(w);
+               return -1;
+       }
        mod = PyParser_ASTFromFile(fp, filename,
                                   Py_single_input, ps1, ps2,
                                   flags, &errcode, arena);
@@ -1203,9 +1208,8 @@ PyRun_StringFlags(const char *str, int start, PyObject *globals,
                  PyObject *locals, PyCompilerFlags *flags)
 {
        PyObject *ret = NULL;
-       PyArena *arena = PyArena_New();
        mod_ty mod;
-
+       PyArena *arena = PyArena_New();
        if (arena == NULL)
                return NULL;
        
@@ -1221,9 +1225,8 @@ PyRun_FileExFlags(FILE *fp, const char *filename, int start, PyObject *globals,
                  PyObject *locals, int closeit, PyCompilerFlags *flags)
 {
        PyObject *ret;
-       PyArena *arena = PyArena_New();
        mod_ty mod;
-
+       PyArena *arena = PyArena_New();
        if (arena == NULL)
                return NULL;
        
@@ -1291,8 +1294,12 @@ Py_CompileStringFlags(const char *str, const char *filename, int start,
                      PyCompilerFlags *flags)
 {
        PyCodeObject *co;
+       mod_ty mod;
        PyArena *arena = PyArena_New();
-       mod_ty mod = PyParser_ASTFromString(str, filename, start, flags, arena);
+       if (arena == NULL)
+               return NULL;
+
+       mod = PyParser_ASTFromString(str, filename, start, flags, arena);
        if (mod == NULL) {
                PyArena_Free(arena);
                return NULL;
@@ -1311,8 +1318,12 @@ struct symtable *
 Py_SymtableString(const char *str, const char *filename, int start)
 {
        struct symtable *st;
+       mod_ty mod;
        PyArena *arena = PyArena_New();
-       mod_ty mod = PyParser_ASTFromString(str, filename, start, NULL, arena);
+       if (arena == NULL)
+               return NULL;
+
+       mod = PyParser_ASTFromString(str, filename, start, NULL, arena);
        if (mod == NULL) {
                PyArena_Free(arena);
                return NULL;
index fae9208a66e8f387e6f7565c696f0120b9fd3862..c010b7a9b2c19ff16e5e95e8d1b30dd730c87cf1 100644 (file)
@@ -727,7 +727,7 @@ symtable_exit_block(struct symtable *st, void *ast)
 {
        Py_ssize_t end;
 
-       Py_DECREF(st->st_cur);
+       Py_CLEAR(st->st_cur);
        end = PyList_GET_SIZE(st->st_stack) - 1;
        if (end >= 0) {
                st->st_cur = (PySTEntryObject *)PyList_GET_ITEM(st->st_stack,