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
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list