Changeset: 8d5febf1a9dc for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=8d5febf1a9dc
Modified Files:
        monetdb5/mal/mal_function.c
        monetdb5/mal/mal_import.c
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_instruction.h
        monetdb5/mal/mal_parser.c
        monetdb5/modules/mal/language.c
        monetdb5/modules/mal/manifold.c
        monetdb5/optimizer/opt_macro.c
        monetdb5/optimizer/opt_mitosis.c
        monetdb5/optimizer/opt_oltp.c
        monetdb5/optimizer/opt_pipes.c
        monetdb5/optimizer/opt_projectionpath.c
        monetdb5/optimizer/opt_pushselect.c
        monetdb5/optimizer/opt_querylog.c
        monetdb5/optimizer/opt_remap.c
        monetdb5/scheduler/run_adder.c
Branch: malparsing
Log Message:

More defenses against failing mallocs.


diffs (truncated from 475 to 300 lines):

diff --git a/monetdb5/mal/mal_function.c b/monetdb5/mal/mal_function.c
--- a/monetdb5/mal/mal_function.c
+++ b/monetdb5/mal/mal_function.c
@@ -385,6 +385,8 @@ cloneFunction(Module scope, Symbol proc,
        }
        freeMalBlk(new->def);
        new->def = copyMalBlk(proc->def);
+       if( new->def == NULL)
+               return NULL;
        /* now change the definition of the original proc */
 #ifdef DEBUG_CLONE
        fprintf(stderr, "CLONED VERSION\n");
diff --git a/monetdb5/mal/mal_import.c b/monetdb5/mal/mal_import.c
--- a/monetdb5/mal/mal_import.c
+++ b/monetdb5/mal/mal_import.c
@@ -212,6 +212,10 @@ compileString(Client cntxt, str s)
        c->fdout = 0;
        freeMalBlk(cntxt->curprg->def);
        cntxt->curprg->def = copyMalBlk(c->curprg->def);
+       if( cntxt->curprg->def == NULL){
+               MCcloseClient(c);
+               throw(MAL,"compileString", MAL_MALLOC_FAIL);
+       }
        MCcloseClient(c);
        return MAL_SUCCEED;
 }
diff --git a/monetdb5/mal/mal_instruction.c b/monetdb5/mal/mal_instruction.c
--- a/monetdb5/mal/mal_instruction.c
+++ b/monetdb5/mal/mal_instruction.c
@@ -16,15 +16,34 @@
 #include "mal_utils.h"
 #include "mal_exception.h"
 
+void
+addMalException(MalBlkPtr mb, str msg)
+{
+    str new;
+    
+    if( mb->errors){ 
+        new = GDKzalloc(strlen(mb->errors) + strlen(msg) + 4);
+        if (new == NULL)
+            return ; // just stick to one error message, ignore rest
+        strcpy(new, mb->errors);
+        strcat(new, msg);
+        GDKfree(mb->errors);
+        mb->errors = new;
+    } else {
+               new = GDKstrdup(msg);
+               if( new == NULL)
+            return ; // just stick to one error message, ignore rest
+               mb->errors = new;
+       }
+}
+
 Symbol
 newSymbol(str nme, int kind)
 {
        Symbol cur;
 
-       if (nme == NULL) {
-               GDKerror("newSymbol:unexpected name (=null)\n");
+       if (nme == NULL)
                return NULL;
-       }
        cur = (Symbol) GDKzalloc(sizeof(SymRecord));
        if (cur == NULL)
                return NULL;
@@ -70,10 +89,8 @@ newMalBlkStmt(MalBlkPtr mb, int maxstmts
        InstrPtr *p;
 
        p = (InstrPtr *) GDKzalloc(sizeof(InstrPtr) * maxstmts);
-       if (p == NULL) {
-               GDKerror("newMalBlk:" MAL_MALLOC_FAIL);
+       if (p == NULL) 
                return -1;
-       }
        mb->stmt = p;
        mb->stop = 0;
        mb->ssize = maxstmts;
@@ -87,17 +104,14 @@ newMalBlk(int elements)
        VarRecord *v;
 
        mb = (MalBlkPtr) GDKmalloc(sizeof(MalBlkRecord));
-       if (mb == NULL) {
-               GDKerror("newMalBlk:" MAL_MALLOC_FAIL);
+       if (mb == NULL) 
                return NULL;
-       }
 
        /* each MAL instruction implies at least on variable 
         * we reserve some extra for constants */
        v = (VarRecord *) GDKzalloc(sizeof(VarRecord) * (elements + 8) );
-       if (v == NULL) {
+       if (v == NULL){
                GDKfree(mb);
-               GDKerror("newMalBlk:" MAL_MALLOC_FAIL);
                return NULL;
        }
        mb->var = v;
@@ -236,10 +250,8 @@ copyMalBlk(MalBlkPtr old)
        int i;
 
        mb = (MalBlkPtr) GDKzalloc(sizeof(MalBlkRecord));
-       if (mb == NULL) {
-               GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
+       if (mb == NULL)
                return NULL;
-       }
        mb->alternative = old->alternative;
        mb->history = NULL;
        mb->keephistory = old->keephistory;
@@ -247,7 +259,6 @@ copyMalBlk(MalBlkPtr old)
        mb->var = (VarRecord *) GDKzalloc(sizeof(VarRecord) * old->vsize);
        if (mb->var == NULL) {
                GDKfree(mb);
-               GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
                return NULL;
        }
 
@@ -264,7 +275,6 @@ copyMalBlk(MalBlkPtr old)
                                VALclear(&mb->var[i].value);
                        GDKfree(mb->var);
                        GDKfree(mb);
-                       GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
                        return NULL;
                }
        }
@@ -276,7 +286,6 @@ copyMalBlk(MalBlkPtr old)
                        VALclear(&mb->var[i].value);
                GDKfree(mb->var);
                GDKfree(mb);
-               GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
                return NULL;
        }
 
@@ -293,7 +302,6 @@ copyMalBlk(MalBlkPtr old)
                        GDKfree(mb->var);
                        GDKfree(mb->stmt);
                        GDKfree(mb);
-                       GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
                        return NULL;
                }
        }
@@ -306,7 +314,6 @@ copyMalBlk(MalBlkPtr old)
                GDKfree(mb->var);
                GDKfree(mb->stmt);
                GDKfree(mb);
-               GDKerror("copyMalBlk:" MAL_MALLOC_FAIL);
                return NULL;
        }
        strncpy(mb->binding,  old->binding, IDLENGTH);
@@ -417,10 +424,8 @@ InstrPtr
 copyInstruction(InstrPtr p)
 {
        InstrPtr new = (InstrPtr) GDKmalloc(offsetof(InstrRecord, argv) + 
p->maxarg * sizeof(p->maxarg));
-       if(new == NULL) {
-               GDKerror("copyInstruction: failed to allocated space");
+       if(new == NULL)
                return new;
-       }
        oldmoveInstruction(new, p);
        return new;
 }
@@ -446,8 +451,8 @@ clrInstruction(InstrPtr p)
 void
 freeInstruction(InstrPtr p)
 {
-       assert(p != 0);
-       GDKfree(p);
+       if( p)
+               GDKfree(p);
 }
 
 /* Moving instructions around calls for care, because all dependent
diff --git a/monetdb5/mal/mal_instruction.h b/monetdb5/mal/mal_instruction.h
--- a/monetdb5/mal/mal_instruction.h
+++ b/monetdb5/mal/mal_instruction.h
@@ -127,6 +127,7 @@
 #define getGDKType(T)          ( T <= TYPE_str ? T : (T == TYPE_any ? 
TYPE_void : findGDKtype(T)))
 
 
+mal_export void addMalException(MalBlkPtr mb, str msg);
 mal_export void mal_instruction_reset(void);
 mal_export InstrPtr newInstruction(MalBlkPtr mb, str modnme, str fcnnme);
 mal_export InstrPtr copyInstruction(InstrPtr p);
diff --git a/monetdb5/mal/mal_parser.c b/monetdb5/mal/mal_parser.c
--- a/monetdb5/mal/mal_parser.c
+++ b/monetdb5/mal/mal_parser.c
@@ -47,13 +47,12 @@ parseError(Client cntxt, str msg)
                        return ; // just stick to one error message
                strcpy(new, old);
                strcat(new, msg);
-               msg = new;
+               mb->errors = createMalException( mb, mb->stop, SYNTAX,
+            "^%d %s", (int)(cntxt->lineptr - cntxt->line), new);
                GDKfree(old);
-               mb->errors = NULL;
-       } else {
-       }
-
-       mb->errors = createMalException( mb, mb->stop, SYNTAX, 
+               GDKfree(new);
+       }  else
+               mb->errors = createMalException( mb, mb->stop, SYNTAX, 
                        "^%d %s", (int)(cntxt->lineptr - cntxt->line), msg);
 }
 
diff --git a/monetdb5/modules/mal/language.c b/monetdb5/modules/mal/language.c
--- a/monetdb5/modules/mal/language.c
+++ b/monetdb5/modules/mal/language.c
@@ -187,7 +187,11 @@ CMDregisterFunction(Client cntxt, MalBlk
        if( help)
                cntxt->curprg->def->help= GDKstrdup(*help);
        sym = newSymbol(putName(*fcn), 0);
+       if( sym == NULL)
+               throw(MAL,"language.register", MAL_MALLOC_FAIL);
        sym->def = copyMalBlk(cntxt->curprg->def);
+       if( sym->def == NULL)
+               throw(MAL,"language.register", MAL_MALLOC_FAIL);
        sig= getSignature(sym);
        sym->name= putName(*fcn);
        setModuleId(sig, putName(*mod));
diff --git a/monetdb5/modules/mal/manifold.c b/monetdb5/modules/mal/manifold.c
--- a/monetdb5/modules/mal/manifold.c
+++ b/monetdb5/modules/mal/manifold.c
@@ -334,6 +334,10 @@ MANIFOLDevaluate(Client cntxt, MalBlkPtr
        mat[0].last = (void *)  Tloc(mat[0].b, BUNlast(mat[0].b));
 
        mut.pci = copyInstruction(pci);
+       if( mut.pci == NULL){
+               msg= createException(MAL,"mal.manifold",MAL_MALLOC_FAIL);
+               goto wrapup;
+       }
        mut.pci->fcn = fcn;
        msg = MANIFOLDjob(&mut);
        freeInstruction(mut.pci);
diff --git a/monetdb5/optimizer/opt_macro.c b/monetdb5/optimizer/opt_macro.c
--- a/monetdb5/optimizer/opt_macro.c
+++ b/monetdb5/optimizer/opt_macro.c
@@ -169,6 +169,9 @@ inlineMALblock(MalBlkPtr mb, int pc, Mal
 
                /* copy the instruction and fix variable references */
                ns[k] = copyInstruction(q);
+               if( ns[k] == NULL)
+                       return -1;
+
                for (n = 0; n < q->argc; n++)
                        getArg(ns[k], n) = nv[getArg(q, n)];
 
@@ -254,6 +257,9 @@ MACROprocessor(Client cntxt, MalBlkPtr m
 
                        last = i;
                        i = inlineMALblock(mb, i, t->def);
+                       if( i < 0)
+                               throw(MAL, "optimizer.MACROoptimizer", 
MAL_MALLOC_FAIL);
+                               
                        cnt++;
                        if (cnt > MAXEXPANSION)
                                throw(MAL, "optimizer.MACROoptimizer", 
MACRO_TOO_DEEP);
@@ -305,6 +311,8 @@ replaceMALblock(MalBlkPtr mb, int pc, Ma
 
        p = getInstrPtr(mb, pc);
        q = copyInstruction(getInstrPtr(mc, 0));        /* the signature */
+       if( q == NULL)
+               return -1;
        q->token = ASSIGNsymbol;
        mb->stmt[pc] = q;
 
@@ -360,9 +368,10 @@ ORCAMprocessor(Client cntxt, MalBlkPtr m
        for (i = 1; i < mb->stop - mc->stop + 3; i++)
                if (malFcnMatch(mc, mb, i)) {
                        msg = MACROvalidate(mc);
-                       if (msg == MAL_SUCCEED)
-                               replaceMALblock(mb, i, mc);
-                       else
+                       if (msg == MAL_SUCCEED){
+                               if( replaceMALblock(mb, i, mc) < 0)
+                                       throw(MAL,"orcam", MAL_MALLOC_FAIL);
+                       } else
                                break;
                }
        chkTypes(cntxt->nspace, mb, FALSE);
diff --git a/monetdb5/optimizer/opt_mitosis.c b/monetdb5/optimizer/opt_mitosis.c
--- a/monetdb5/optimizer/opt_mitosis.c
+++ b/monetdb5/optimizer/opt_mitosis.c
@@ -236,6 +236,13 @@ OPTmitosisImplementation(Client cntxt, M
 
                for (j = 0; j < pieces; j++) {
                        q = copyInstruction(p);
+                       if( q == NULL){
+                               for (; i<limit; i++) 
+                                       if (old[i])
+                                               pushInstruction(mb,old[i]);
+                               GDKfree(old);
+                               throw(MAL,"optimizer.mitosis", MAL_MALLOC_FAIL);
+                       }
                        q = pushInt(mb, q, j);
                        q = pushInt(mb, q, pieces);
 
diff --git a/monetdb5/optimizer/opt_oltp.c b/monetdb5/optimizer/opt_oltp.c
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to