Changeset: cd3b01df1308 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=cd3b01df1308
Modified Files:
        monetdb5/mal/mal_instruction.c
        monetdb5/mal/mal_interpreter.c
        sql/backends/monet5/sql.c
        sql/backends/monet5/sql_execute.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_scenario.c
        sql/backends/monet5/sql_statement.c
        sql/server/sql_mvc.c
        sql/server/sql_mvc.h
Branch: default
Log Message:

Please check for allocation failures


diffs (truncated from 311 to 300 lines):

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
@@ -1242,7 +1242,8 @@ defConstant(MalBlkPtr mb, int type, ValP
                setVarCleanup(mb, k);
        else
                clrVarCleanup(mb, k);
-       VALcopy( &getVarConstant(mb, k),cst);
+       if(VALcopy( &getVarConstant(mb, k),cst) == NULL)
+               return -1;
        if (ATOMextern(cst->vtype) && cst->val.pval)
                VALclear(cst);
        return k;
diff --git a/monetdb5/mal/mal_interpreter.c b/monetdb5/mal/mal_interpreter.c
--- a/monetdb5/mal/mal_interpreter.c
+++ b/monetdb5/mal/mal_interpreter.c
@@ -238,13 +238,14 @@ str malCommandCall(MalStkPtr stk, InstrP
  * Also we cannot overwrite values on the stack as this maybe part of a
  * sequence of factory calls.
  */
-#define initStack(S)\
+#define initStack(S, R)\
        for (i = S; i < mb->vtop; i++) {\
                lhs = &stk->stk[i];\
                if (isVarConstant(mb, i) > 0) {\
                        if (!isVarDisabled(mb, i)) {\
                                rhs = &getVarConstant(mb, i);\
-                               VALcopy(lhs, rhs);\
+                               if(VALcopy(lhs, rhs) == NULL) \
+                                       R = 0; \
                        }\
                } else {\
                        lhs->vtype = getVarGDKType(mb, i);\
@@ -267,7 +268,7 @@ MalStkPtr
 prepareMALstack(MalBlkPtr mb, int size)
 {
        MalStkPtr stk = NULL;
-       int i;
+       int i, res = 1;
        ValPtr lhs, rhs;
 
        stk = newGlobalStack(size);
@@ -279,7 +280,9 @@ prepareMALstack(MalBlkPtr mb, int size)
        stk->stktop = mb->vtop;
        stk->blk = mb;
 
-       initStack(0);
+       initStack(0, res);
+       if(!res)
+               return NULL;
        return stk;
 }
 
@@ -307,12 +310,15 @@ str runMAL(Client cntxt, MalBlkPtr mb, M
         */
        cntxt->lastcmd= time(0);
        if (env != NULL) {
+               int res = 1;
                stk = env;
                if (mb != stk->blk)
                        throw(MAL, "mal.interpreter","misalignment of symbols");
                if (mb->vtop > stk->stksize)
                        throw(MAL, "mal.interpreter","stack too small");
-               initStack(env->stkbot);
+               initStack(env->stkbot, res);
+               if(!res)
+                       throw(MAL, "mal.interpreter", MAL_MALLOC_FAIL);
        } else {
                stk = prepareMALstack(mb, mb->vsize);
                if (stk == 0)
@@ -415,9 +421,12 @@ callMAL(Client cntxt, MalBlkPtr mb, MalS
                        *env = stk;
                } else {
                        ValPtr lhs, rhs;
+                       int res = 1;
 
                        stk = *env;
-                       initStack(0);
+                       initStack(0, res);
+                       if(!res)
+                               throw(MAL, "mal.interpreter", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
                }
                assert(stk);
                for (i = pci->retc; i < pci->argc; i++) {
@@ -618,8 +627,10 @@ str runMALsequence(Client cntxt, MalBlkP
                        for (k = 0, i = pci->retc; k < pci->retc && i < 
pci->argc; i++, k++) {
                                lhs = &stk->stk[pci->argv[k]];
                                rhs = &stk->stk[pci->argv[i]];
-                               VALcopy(lhs, rhs);
-                               if (lhs->vtype == TYPE_bat && 
!is_bat_nil(lhs->val.bval))
+                               if(VALcopy(lhs, rhs) == NULL) {
+                                       ret = createException(MAL, 
"mal.interpreter", MAL_MALLOC_FAIL);
+                                       break;
+                               } else if (lhs->vtype == TYPE_bat && 
!is_bat_nil(lhs->val.bval))
                                        BBPretain(lhs->val.bval);
                        }
                        freeException(ret);
@@ -627,7 +638,7 @@ str runMALsequence(Client cntxt, MalBlkP
                        break;
                case PATcall:
                        if (pci->fcn == NULL) {
-                               ret = createException(MAL,"interpreter", 
"address of pattern %s.%s missing", pci->modname, pci->fcnname);
+                               ret = createException(MAL,"mal.interpreter", 
"address of pattern %s.%s missing", pci->modname, pci->fcnname);
                        } else {
                                ret = (*pci->fcn)(cntxt, mb, stk, pci);
 #ifndef NDEBUG
@@ -685,7 +696,7 @@ str runMALsequence(Client cntxt, MalBlkP
                         * counting.
                         */
                        if (pci->blk == NULL)
-                               ret = createException(MAL,"interpreter", 
"%s.%s[%d] reference to MAL function missing", getModuleId(pci), 
getFunctionId(pci), pci->pc);
+                               ret = createException(MAL,"mal.interpreter", 
"%s.%s[%d] reference to MAL function missing", getModuleId(pci), 
getFunctionId(pci), pci->pc);
                        else {
                                /* show call before entering the factory */
                                if (cntxt->itrace || mb->trap) {
@@ -740,15 +751,20 @@ str runMALsequence(Client cntxt, MalBlkP
                                for (ii = pci->retc; ii < pci->argc; 
ii++,arg++) {
                                        lhs = &nstk->stk[q->argv[arg]];
                                        rhs = &stk->stk[pci->argv[ii]];
-                                       VALcopy(lhs, rhs);
-                                       if (lhs->vtype == TYPE_bat)
+                                       if(VALcopy(lhs, rhs) == NULL) {
+                                               GDKfree(nstk);
+                                               ret = createException(MAL, 
"mal.interpreter", MAL_MALLOC_FAIL);
+                                               break;
+                                       } else if (lhs->vtype == TYPE_bat)
                                                BBPretain(lhs->val.bval);
                                }
-                               ret = runMALsequence(cntxt, pci->blk, 1, 
pci->blk->stop, nstk, stk, pci);
-                               for (ii = 0; ii < nstk->stktop; ii++)
-                                       if (ATOMextern(nstk->stk[ii].vtype))
-                                               GDKfree(nstk->stk[ii].val.pval);
-                               GDKfree(nstk);
+                               if(!ret) {
+                                       ret = runMALsequence(cntxt, pci->blk, 
1, pci->blk->stop, nstk, stk, pci);
+                                       for (ii = 0; ii < nstk->stktop; ii++)
+                                               if 
(ATOMextern(nstk->stk[ii].vtype))
+                                                       
GDKfree(nstk->stk[ii].val.pval);
+                                       GDKfree(nstk);
+                               }
                        }
                        break;
                case NOOPsymbol:
@@ -1004,7 +1020,7 @@ str runMALsequence(Client cntxt, MalBlkP
                                        stkpc = pci->jump;
                                break;
                        default:
-                               ret = createException(MAL,"interpreter", "%s: 
Unknown barrier type", getVarName(mb, getDestVar(pci)));
+                               ret = createException(MAL,"mal.interpreter", 
"%s: Unknown barrier type", getVarName(mb, getDestVar(pci)));
                        }
                        stkpc++;
                        break;
@@ -1156,8 +1172,10 @@ str runMALsequence(Client cntxt, MalBlkP
                                        for (i = 0; i < pci->retc; i++) {
                                                rhs = &stk->stk[pp->argv[i]];
                                                lhs = &env->stk[pci->argv[i]];
-                                               VALcopy(lhs, rhs);
-                                               if (lhs->vtype == TYPE_bat)
+                                               if(VALcopy(lhs, rhs) == NULL) {
+                                                       ret = 
createException(MAL, "mal.interpreter", MAL_MALLOC_FAIL);
+                                                       break;
+                                               } else if (lhs->vtype == 
TYPE_bat)
                                                        
BBPretain(lhs->val.bval);
                                        }
                                        if (garbageControl(getInstrPtr(mb, 0)))
diff --git a/sql/backends/monet5/sql.c b/sql/backends/monet5/sql.c
--- a/sql/backends/monet5/sql.c
+++ b/sql/backends/monet5/sql.c
@@ -578,7 +578,8 @@ setVariable(Client cntxt, MalBlkPtr mb, 
                        _DELETE(msg);
                        throw(SQL, "sql.setVariable", SQLSTATE(42100) "%s", 
buf);
                }
-               stack_set_var(m, varname, src);
+               if(!stack_set_var(m, varname, src))
+                       throw(SQL, "sql.setVariable", SQLSTATE(HY001) 
MAL_MALLOC_FAIL);
        } else {
                snprintf(buf, BUFSIZ, "variable '%s' unknown", varname);
                throw(SQL, "sql.setVariable", SQLSTATE(42100) "%s", buf);
diff --git a/sql/backends/monet5/sql_execute.c 
b/sql/backends/monet5/sql_execute.c
--- a/sql/backends/monet5/sql_execute.c
+++ b/sql/backends/monet5/sql_execute.c
@@ -321,6 +321,7 @@ SQLrun(Client c, backend *be, mvc *m)
                                atom *arg = m->args[j];
                                
                                if (!atom_cast(m->sa, arg, pt)) {
+                                       freeMalBlk(mb);
                                        throw(SQL, "sql.prepare", 
SQLSTATE(07001) "EXEC: wrong type for argument %d of " "query template : %s, 
expected %s", i + 1, atom_type(arg)->type->sqlname, pt->type->sqlname);
                                }
                                val= (ValPtr) &arg->data;
diff --git a/sql/backends/monet5/sql_gencode.c 
b/sql/backends/monet5/sql_gencode.c
--- a/sql/backends/monet5/sql_gencode.c
+++ b/sql/backends/monet5/sql_gencode.c
@@ -61,7 +61,8 @@ constantAtom(backend *sql, MalBlkPtr mb,
 
        (void) sql;
        cst.vtype = 0;
-       VALcopy(&cst, vr);
+       if(VALcopy(&cst, vr) == NULL)
+               return -1;
        idx = defConstant(mb, vr->vtype, &cst);
        return idx;
 }
@@ -625,7 +626,9 @@ backend_callinline(backend *be, Client c
                                sql_subtype *t = atom_type(a);
                                (void) pushNil(curBlk, curInstr, 
t->type->localtype);
                        } else {
-                               int _t = constantAtom(be, curBlk, a);
+                               int _t;
+                               if((_t = constantAtom(be, curBlk, a)) == -1)
+                                       return -1;
                                (void) pushArgument(curBlk, curInstr, _t);
                        }
                }
@@ -755,7 +758,11 @@ backend_call(backend *be, Client c, cq *
                                /* need type from the prepared argument */
                                q = pushNil(mb, q, t->type->localtype);
                        } else {
-                               int _t = constantAtom(be, mb, a);
+                               int _t;
+                               if((_t = constantAtom(be, mb, a)) == -1) {
+                                       (void) sql_error(m, 02, SQLSTATE(HY001) 
"Allocation failure during function call: %s\n", atom_type(a)->type->sqlname);
+                                       break;
+                               }
                                q = pushArgument(mb, q, _t);
                        }
                }
diff --git a/sql/backends/monet5/sql_scenario.c 
b/sql/backends/monet5/sql_scenario.c
--- a/sql/backends/monet5/sql_scenario.c
+++ b/sql/backends/monet5/sql_scenario.c
@@ -277,15 +277,12 @@ SQLinit(void)
                }
                GDKregister(idlethread);
        }
-       WLCinit();
-       return MAL_SUCCEED;
+       return WLCinit();
 }
 
-#define SQLglobal(name, val, failure)                                       \
-       if(stack_push_var(sql, name, &ctype))                                   
\
-               stack_set_var(sql, name, VALset(&src, ctype.type->localtype, 
val)); \
-       else                                                                    
\
-               failure--;                                                      
    \
+#define SQLglobal(name, val, failure)                                          
                                   \
+       if(!stack_push_var(sql, name, &ctype) || !stack_set_var(sql, name, 
VALset(&src, ctype.type->localtype, val))) \
+               failure--;
 
 #define NR_GLOBAL_VARS 10
 /* NR_GLOBAL_VAR should match exactly the number of variables created
diff --git a/sql/backends/monet5/sql_statement.c 
b/sql/backends/monet5/sql_statement.c
--- a/sql/backends/monet5/sql_statement.c
+++ b/sql/backends/monet5/sql_statement.c
@@ -1237,7 +1237,11 @@ stmt_atom(backend *be, atom *a)
        if (atom_null(a)) {
                q = pushNil(mb, q, atom_type(a)->type->localtype);
        } else {
-               int k = constantAtom(be, mb, a);
+               int k;
+               if((k = constantAtom(be, mb, a)) == -1) {
+                       freeInstruction(q);
+                       return NULL;
+               }
 
                q = pushArgument(mb, q, k);
        }
diff --git a/sql/server/sql_mvc.c b/sql/server/sql_mvc.c
--- a/sql/server/sql_mvc.c
+++ b/sql/server/sql_mvc.c
@@ -1455,22 +1455,26 @@ stack_push_rel_view(mvc *sql, const char
        return res;
 }
 
-void
+atom *
 stack_set_var(mvc *sql, const char *name, ValRecord *v)
 {
        int i;
+       atom *res = NULL;
 
        for (i = sql->topvars-1; i >= 0; i--) {
                if (!sql->vars[i].frame && strcmp(sql->vars[i].name, name)==0) {
                        VALclear(&sql->vars[i].a.data);
-                       VALcopy(&sql->vars[i].a.data, v);
+                       if(VALcopy(&sql->vars[i].a.data, v) == NULL)
+                               return NULL;
                        sql->vars[i].a.isnull = VALisnil(v);
                        if (v->vtype == TYPE_flt)
                                sql->vars[i].a.d = v->val.fval;
                        else if (v->vtype == TYPE_dbl)
                                sql->vars[i].a.d = v->val.dval;
+                       res = &sql->vars[i].a;
                }
        }
+       return res;
 }
 
 atom *
diff --git a/sql/server/sql_mvc.h b/sql/server/sql_mvc.h
--- a/sql/server/sql_mvc.h
+++ b/sql/server/sql_mvc.h
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to