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