Changeset: 7c0e4baa6fed for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7c0e4baa6fed Modified Files: monetdb5/mal/mal_instruction.c monetdb5/optimizer/opt_wrapper.c sql/backends/monet5/sql_execute.c sql/test/malloc_fail/Tests/All sql/test/malloc_fail/Tests/mallocs.SQL.py Branch: default Log Message:
more malloc fail checks and re-enabled test case diffs (110 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 @@ -263,13 +263,17 @@ copyMalBlk(MalBlkPtr old) // copy all variable records for (i = 0; i < old->vtop; i++) { mb->var[i]= old->var[i]; - VALcopy(&(mb->var[i].value), &(old->var[i].value)); + if (!VALcopy(&(mb->var[i].value), &(old->var[i].value))) { + GDKfree(mb); + GDKerror("copyMalBlk:" MAL_MALLOC_FAIL); + return NULL; + } } mb->stmt = (InstrPtr *) GDKzalloc(sizeof(InstrPtr) * old->ssize); if (mb->stmt == NULL) { - GDKfree(mb->var); + GDKfree(mb->var); // this leaks strings in var GDKfree(mb); GDKerror("copyMalBlk:" MAL_MALLOC_FAIL); return NULL; @@ -278,10 +282,20 @@ copyMalBlk(MalBlkPtr old) mb->stop = old->stop; mb->ssize = old->ssize; assert(old->stop < old->ssize); - for (i = 0; i < old->stop; i++) + for (i = 0; i < old->stop; i++) { mb->stmt[i] = copyInstruction(old->stmt[i]); - + if(!mb->stmt[i]) { + GDKfree(mb); + GDKerror("copyMalBlk:" MAL_MALLOC_FAIL); + return NULL; + } + } mb->help = old->help ? GDKstrdup(old->help) : NULL; + if (old->help && !mb->help) { + GDKfree(mb); + GDKerror("copyMalBlk:" MAL_MALLOC_FAIL); + return NULL; + } strncpy(mb->binding, old->binding, IDLENGTH); mb->errors = old->errors; mb->tag = old->tag; diff --git a/monetdb5/optimizer/opt_wrapper.c b/monetdb5/optimizer/opt_wrapper.c --- a/monetdb5/optimizer/opt_wrapper.c +++ b/monetdb5/optimizer/opt_wrapper.c @@ -146,7 +146,7 @@ str OPTwrapper (Client cntxt, MalBlkPtr for (i=0; codes[i].nme; i++) if (strcmp(codes[i].nme, optimizer) == 0){ actions = (int)(*(codes[i].fcn))(cntxt, mb, stk, 0); - if (actions < 1) { + if (actions < 0) { throw(MAL, optimizer, "Error in optimizer %s", optimizer); } break; 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 @@ -271,6 +271,9 @@ SQLrun(Client c, backend *be, mvc *m){ return createException(PARSE, "SQLparser", "%s", m->errstr); // locate and inline the query template instruction mb = copyMalBlk(c->curprg->def); + if (!mb) { + throw(SQL, "sql.prepare", "Out of memory"); + } mb->history = c->curprg->def->history; c->curprg->def->history = 0; diff --git a/sql/test/malloc_fail/Tests/All b/sql/test/malloc_fail/Tests/All --- a/sql/test/malloc_fail/Tests/All +++ b/sql/test/malloc_fail/Tests/All @@ -1,1 +1,1 @@ -# mallocs not run for now since it hangs mserver +# mallocs still hangs diff --git a/sql/test/malloc_fail/Tests/mallocs.SQL.py b/sql/test/malloc_fail/Tests/mallocs.SQL.py --- a/sql/test/malloc_fail/Tests/mallocs.SQL.py +++ b/sql/test/malloc_fail/Tests/mallocs.SQL.py @@ -1,6 +1,10 @@ import pymonetdb import os +import logging +logging.basicConfig() + + dbh = pymonetdb.connect(database = os.environ['TSTDB'], port = int(os.environ['MAPIPORT']), hostname = "localhost") @@ -15,14 +19,15 @@ create procedure setmallocsuccesscount(c call setmallocsuccesscount(%d); SELECT * FROM tables; """ -i = 3300 +i = 3000 + while i > 1000: - #print(i) + print(i) i-=1 try: cursor.execute(q % (i)) except Exception as e: - #print(e) + # print(e) pass finally: dbh.rollback() _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list