Changeset: 7fafd52a0337 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7fafd52a0337 Modified Files: common/stream/stream.c sql/backends/monet5/sql_gencode.c sql/common/sql_list.c Branch: Jul2017 Log Message:
Defensive lines for malloc failures diffs (222 lines): diff --git a/common/stream/stream.c b/common/stream/stream.c --- a/common/stream/stream.c +++ b/common/stream/stream.c @@ -3458,6 +3458,10 @@ buffer_get_buf(buffer *b) r = b->buf; r[b->pos] = '\0'; b->buf = malloc(b->len); + if (b->buf == NULL) { + free(b); + return NULL; + } b->len = b->buf ? b->len : 0; b->pos = 0; return r; 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 @@ -158,6 +158,8 @@ static int curInstr = getInstrPtr(curBlk, 0); curInstr = relational_func_create_result(m, curBlk, curInstr, r); + if( curInstr == NULL) + return -1; setVarUDFtype(curBlk, 0); /* ops */ @@ -232,17 +234,34 @@ static int static str rel2str( mvc *sql, sql_rel *rel) { - buffer *b; - stream *s = buffer_wastream(b = buffer_create(1024), "rel_dump"); - list *refs = sa_list(sql->sa); - char *res = NULL; + buffer *b = NULL; + stream *s = NULL; + list *refs = NULL; + char *res = NULL; + + b = buffer_create(1024); + if(b == NULL) { + goto cleanup; + } + s = buffer_wastream(b, "rel_dump"); + if(s == NULL) { + goto cleanup; + } + refs = sa_list(sql->sa); + if (!refs) { + goto cleanup; + } rel_print_refs(sql, s, rel, 0, refs, 0); rel_print_(sql, s, rel, 0, refs, 0); mnstr_printf(s, "\n"); res = buffer_get_buf(b); - buffer_destroy(b); - mnstr_destroy(s); + +cleanup: + if(b) + buffer_destroy(b); + if(s) + mnstr_destroy(s); return res; } @@ -258,26 +277,47 @@ static int node *n; int i, q, v; int *lret, *rret; - char *lname = GDKstrdup(name); + char *lname; sql_rel *r = rel; + if(uri == NULL) + return -1; + + lname = GDKstrdup(name); + if(lname == NULL) + return -1; + if (is_topn(r->op)) r = r->l; if (!is_project(r->op)) r = rel_project(m->sa, r, rel_projections(m, r, NULL, 1, 1)); lret = SA_NEW_ARRAY(m->sa, int, list_length(r->exps)); + if(lret == NULL) { + GDKfree(lname); + return -1; + } rret = SA_NEW_ARRAY(m->sa, int, list_length(r->exps)); + if(rret == NULL) { + GDKfree(lname); + return -1; + } /* create stub */ backup = c->curprg; c->curprg = newFunction(putName(mod), putName(name), FUNCTIONsymbol); - if( c->curprg == NULL) + if( c->curprg == NULL) { + GDKfree(lname); return -1; + } lname[0] = 'l'; curBlk = c->curprg->def; curInstr = getInstrPtr(curBlk, 0); curInstr = relational_func_create_result(m, curBlk, curInstr, rel); + if( curInstr == NULL) { + GDKfree(lname); + return -1; + } setVarUDFtype(curBlk, 0); /* ops */ @@ -345,9 +385,15 @@ static int int len = 1024, nr = 0; char *s, *buf = GDKmalloc(len); if (!buf) { + GDKfree(lname); return -1; } s = rel2str(m, rel); + if (!s) { + GDKfree(lname); + GDKfree(buf); + return -1; + } o = newFcnCall(curBlk, remoteRef, putRef); o = pushArgument(curBlk, o, q); o = pushStr(curBlk, o, s); /* relational plan */ @@ -364,17 +410,26 @@ static int sql_subtype *t = tail_type(op); const char *nme = (op->op3)?op->op3->op4.aval->data.val.sval:op->cname; - if ((nr + 100) > len) + if ((nr + 100) > len) { buf = GDKrealloc(buf, len*=2); + if(buf == NULL) + break; + } + nr += snprintf(buf+nr, len-nr, "%s %s(%u,%u)%c", nme, t->type->sqlname, t->digits, t->scale, n->next?',':' '); } s = buf; } - o = newFcnCall(curBlk, remoteRef, putRef); - o = pushArgument(curBlk, o, q); - o = pushStr(curBlk, o, s); /* signature */ - p = pushArgument(curBlk, p, getArg(o,0)); - GDKfree(buf); + if(buf) { + o = newFcnCall(curBlk, remoteRef, putRef); + o = pushArgument(curBlk, o, q); + o = pushStr(curBlk, o, s); /* signature */ + p = pushArgument(curBlk, p, getArg(o,0)); + GDKfree(buf); + } else { + GDKfree(lname); + return -1; + } } pushInstruction(curBlk, p); @@ -491,6 +546,9 @@ backend_dumpstmt(backend *be, MalBlkPtr if (query) { tt = t = GDKstrdup(query); + if(t == NULL) { + return -1; + } while (t && isspace((int) *t)) t++; @@ -504,6 +562,9 @@ backend_dumpstmt(backend *be, MalBlkPtr q = pushStr(mb, q, t); GDKfree(tt); q = pushStr(mb, q, getSQLoptimizer(be->mvc)); + if (q == NULL) { + return -1; + } } /* announce the transaction mode */ @@ -897,8 +958,11 @@ backend_create_sql_func(backend *be, sql if (f->res) { sql_arg *res = f->res->h->data; - if (f->type == F_UNION) + if (f->type == F_UNION) { curInstr = table_func_create_result(curBlk, curInstr, f, restypes); + if( curInstr == NULL) + goto cleanup; + } else setArgType(curBlk, curInstr, 0, res->type.type->localtype); } else { diff --git a/sql/common/sql_list.c b/sql/common/sql_list.c --- a/sql/common/sql_list.c +++ b/sql/common/sql_list.c @@ -44,6 +44,9 @@ list * sa_list(sql_allocator *sa) { list *l = (sa)?SA_ZNEW(sa, list):ZNEW(list); + if (!l) { + return NULL; + } l->sa = sa; l->destroy = NULL; @@ -58,6 +61,9 @@ list * list_new(sql_allocator *sa, fdestroy destroy) { list *l = (sa)?SA_ZNEW(sa, list):ZNEW(list); + if (!l) { + return NULL; + } l->sa = sa; l->destroy = destroy; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list