Changeset: c02d33eda37a for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=c02d33eda37a Modified Files: monetdb5/optimizer/opt_mergetable.c Branch: Mar2018 Log Message:
More allocation checks in merge table optimizer diffs (truncated from 837 to 300 lines): diff --git a/monetdb5/optimizer/opt_mergetable.c b/monetdb5/optimizer/opt_mergetable.c --- a/monetdb5/optimizer/opt_mergetable.c +++ b/monetdb5/optimizer/opt_mergetable.c @@ -89,7 +89,7 @@ nr_of_bats(MalBlkPtr mb, InstrPtr p) /* some mat's have intermediates (with intermediate result variables), therefor * we pass the old output mat variable */ -inline static void +inline static int mat_add_var(matlist_t *ml, InstrPtr q, InstrPtr p, int var, mat_type_t type, int inputmat, int parentmat, int pushed) { mat_t *dst = &ml->v[ml->top]; @@ -97,7 +97,7 @@ mat_add_var(matlist_t *ml, InstrPtr q, I int s = ml->size * 2; mat_t *v = (mat_t*)GDKzalloc(s * sizeof(mat_t)); if (!v) - return; /* FIXME: error checking */ + return -1; memcpy(v, ml->v, ml->top * sizeof(mat_t)); GDKfree(ml->v); ml->size = s; @@ -119,14 +119,15 @@ mat_add_var(matlist_t *ml, InstrPtr q, I ml->vars[var] = ml->top; } ++ml->top; + return 0; } -inline static void +inline static int mat_add(matlist_t *ml, InstrPtr q, mat_type_t type, const char *func) { - mat_add_var(ml, q, NULL, getArg(q,0), type, -1, -1, 0); (void)func; //printf (" ml.top %d %s\n", ml.top, func); + return mat_add_var(ml, q, NULL, getArg(q,0), type, -1, -1, 0); } static void @@ -172,67 +173,85 @@ mat_pack(MalBlkPtr mb, matlist_t *ml, in pushInstruction(mb, r); } -static void +static int checksize(matlist_t *ml, int v) { if (v >= ml->vsize) { - int sz = ml->vsize, i; + int sz = ml->vsize, i, nvsize, *nhorigin, *ntorigin, *nvars; - ml->vsize *= 2; - ml->horigin = (int*) GDKrealloc(ml->horigin, sizeof(int)* ml->vsize); - ml->torigin = (int*) GDKrealloc(ml->torigin, sizeof(int)* ml->vsize); - ml->vars = (int*) GDKrealloc(ml->vars, sizeof(int)* ml->vsize); + nvsize = ml->vsize * 2; + nhorigin = (int*) GDKrealloc(ml->horigin, sizeof(int)* nvsize); + ntorigin = (int*) GDKrealloc(ml->torigin, sizeof(int)* nvsize); + nvars = (int*) GDKrealloc(ml->vars, sizeof(int)* nvsize); + if(!nhorigin || !ntorigin || !nvars) { + if(nhorigin) + GDKfree(nhorigin); + if(ntorigin) + GDKfree(ntorigin); + if(nvars) + GDKfree(nvars); + return -1; + } + ml->vsize = nvsize; + ml->horigin = nhorigin; + ml->torigin = ntorigin; + ml->vars = nvars; + for (i = sz; i < ml->vsize; i++) { ml->horigin[i] = ml->torigin[i] = -1; ml->vars[i] = -1; } } + return 0; } -static void +static int setPartnr(matlist_t *ml, int ivar, int ovar, int pnr) { int tpnr = -1; - checksize(ml, ivar); - checksize(ml, ovar); + if(checksize(ml, ivar) || checksize(ml, ovar)) + return -1; if (ivar >= 0) tpnr = ml->torigin[ivar]; if (tpnr >= 0) ml->torigin[ovar] = tpnr; ml->horigin[ovar] = pnr; //printf("%d %d ", pnr, tpnr); + return 0; } -static void +static int propagatePartnr(matlist_t *ml, int ivar, int ovar, int pnr) { /* prop head ids to tail */ int tpnr = -1; - checksize(ml, ivar); - checksize(ml, ovar); + if(checksize(ml, ivar) || checksize(ml, ovar)) + return -1; if (ivar >= 0) tpnr = ml->horigin[ivar]; if (tpnr >= 0) ml->torigin[ovar] = tpnr; ml->horigin[ovar] = pnr; //printf("%d %d ", pnr, tpnr); + return 0; } -static void +static int propagateMirror(matlist_t *ml, int ivar, int ovar) { /* prop head ids to head and tail */ int tpnr; - checksize(ml, ivar); - checksize(ml, ovar); - tpnr = ml->horigin[ivar]; + if(checksize(ml, ivar) || checksize(ml, ovar)) + return -1; + tpnr = ml->horigin[ivar]; if (tpnr >= 0) { ml->horigin[ovar] = tpnr; ml->torigin[ovar] = tpnr; - } + } + return 0; } static int @@ -254,17 +273,19 @@ overlap(matlist_t *ml, int lv, int rv, i return lpnr == rpnr; } -static void +static int mat_set_prop(matlist_t *ml, MalBlkPtr mb, InstrPtr p) { int k, tpe = getArgType(mb, p, 0); tpe = getBatType(tpe); for(k=1; k < p->argc; k++) { - setPartnr(ml, -1, getArg(p,k), k); - if (tpe == TYPE_oid) - propagateMirror(ml, getArg(p,k), getArg(p,k)); + if(setPartnr(ml, -1, getArg(p,k), k)) + return -1; + if (tpe == TYPE_oid && propagateMirror(ml, getArg(p,k), getArg(p,k))) + return -1; } + return 0; } static InstrPtr @@ -297,8 +318,8 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I /* make sure to resolve again */ q->token = ASSIGNsymbol; q->typechk = TYPE_UNKNOWN; - q->fcn = NULL; - q->blk = NULL; + q->fcn = NULL; + q->blk = NULL; getArg(q, 0) = newTmpVariable(mb, tpe); getArg(q, mvar) = getArg(mat[m].mi, j); @@ -306,7 +327,10 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I getArg(q, ovar) = getArg(mat[o].mi, j); getArg(q, evar) = getArg(mat[e].mi, k); pushInstruction(mb, q); - setPartnr(ml, getArg(mat[m].mi, j), getArg(q,0), nr); + if(setPartnr(ml, getArg(mat[m].mi, j), getArg(q,0), nr)) { + freeInstruction(r); + return NULL; + } r = pushArgument(mb, r, getArg(q, 0)); nr++; @@ -326,8 +350,8 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I /* make sure to resolve again */ q->token = ASSIGNsymbol; q->typechk = TYPE_UNKNOWN; - q->fcn = NULL; - q->blk = NULL; + q->fcn = NULL; + q->blk = NULL; getArg(q, 0) = newTmpVariable(mb, tpe); getArg(q, mvar) = getArg(mat[m].mi, k); @@ -336,11 +360,14 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I if (e >= 0) getArg(q, evar) = getArg(mat[e].mi, k); pushInstruction(mb, q); - setPartnr(ml, is_subdelta?getArg(mat[m].mi, k):-1, getArg(q,0), k); + if(setPartnr(ml, is_subdelta?getArg(mat[m].mi, k):-1, getArg(q,0), k)) { + freeInstruction(r); + return NULL; + } r = pushArgument(mb, r, getArg(q, 0)); } if (evar == 1 && e >= 0 && mat[e].type == mat_slc && is_projectdelta) { - InstrPtr q = newInstruction(mb, algebraRef, projectionRef); + InstrPtr q = newInstruction(mb, algebraRef, projectionRef); getArg(q, 0) = getArg(r, 0); q = pushArgument(mb, q, getArg(mat[e].mi, 0)); getArg(r, 0) = newTmpVariable(mb, tpe); @@ -351,7 +378,8 @@ mat_delta(matlist_t *ml, MalBlkPtr mb, I r = q; } } - mat_add_var(ml, r, NULL, getArg(r, 0), mat_type(mat, m), -1, -1, pushed); + if(mat_add_var(ml, r, NULL, getArg(r, 0), mat_type(mat, m), -1, -1, pushed)) + return NULL; if (pushed) matlist_pack(ml, ml->top-1); return r; @@ -381,8 +409,10 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat tpe = getArgType(mb,p,0); if (is_identity) { - if((q = newInstruction(mb, NULL,NULL)) == NULL) + if((q = newInstruction(mb, NULL,NULL)) == NULL) { + freeInstruction(r); return NULL; + } getArg(q, 0) = newTmpVariable(mb, TYPE_oid); q->retc = 1; q->argc = 1; @@ -391,8 +421,11 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat pushInstruction(mb, q); } for(k=1; k < mat[m].mi->argc; k++) { - if((q = copyInstruction(p)) == NULL) + int res = 0; + if((q = copyInstruction(p)) == NULL) { + freeInstruction(r); return NULL; + } if (is_assign) getArg(q, 0) = getArg(mat[n].mi, k); @@ -408,17 +441,21 @@ mat_apply1(MalBlkPtr mb, InstrPtr p, mat /* make sure to resolve again */ q->token = ASSIGNsymbol; q->typechk = TYPE_UNKNOWN; - q->fcn = NULL; - q->blk = NULL; + q->fcn = NULL; + q->blk = NULL; } ident_var = getArg(q, 1); pushInstruction(mb, q); if (is_mirror || is_identity) { - propagateMirror(ml, getArg(mat[m].mi, k), getArg(q,0)); + res = propagateMirror(ml, getArg(mat[m].mi, k), getArg(q,0)); } else if (is_select) - propagatePartnr(ml, getArg(mat[m].mi, k), getArg(q,0), k); + res = propagatePartnr(ml, getArg(mat[m].mi, k), getArg(q,0), k); else - setPartnr(ml, -1, getArg(q,0), k); + res = setPartnr(ml, -1, getArg(q,0), k); + if(res) { + freeInstruction(r); + return NULL; + } r = pushArgument(mb, r, getArg(q, 0)); } return r; @@ -436,16 +473,19 @@ mat_apply2(matlist_t *ml, MalBlkPtr mb, if((r[k] = newInstruction(mb, matRef, packRef)) == NULL) { for(l=0; l < k; l++) freeInstruction(r[l]); + GDKfree(r); return -1; } getArg(r[k],0) = getArg(p,k); } for(k=1; k < mat[m].mi->argc; k++) { - int l, tpe; + int tpe; InstrPtr q = copyInstruction(p); - if(!q) + if(!q) { + GDKfree(r); return -1; + } for(l=0; l < p->retc; l++) { _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list