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