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

Reply via email to