Changeset: 3abadf4c1b7e for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=3abadf4c1b7e
Modified Files:
        monetdb5/optimizer/opt_mergetable.c
        sql/backends/monet5/UDF/pyapi/emit.c
        sql/backends/monet5/rel_bin.c
        sql/backends/monet5/sql_gencode.c
        sql/backends/monet5/sql_statement.c
        sql/common/sql_keyword.c
        sql/common/sql_stack.c
        sql/common/sql_string.c
        sql/common/sql_types.c
        sql/include/sql_keyword.h
        sql/server/rel_semantic.c
        sql/server/rel_updates.c
        sql/server/sql_mvc.c
        sql/server/sql_scan.c
        sql/server/sql_scan.h
        sql/storage/bat/bat_table.c
        sql/storage/store.c
        sql/storage/store_dependency.c
        sql/storage/store_sequence.c
Branch: Jul2017
Log Message:

Malloc failures checks


diffs (truncated from 1358 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
@@ -421,8 +421,9 @@ mat_apply2(matlist_t *ml, MalBlkPtr mb, 
 {
        int k, is_select = isSelect(p);
        InstrPtr *r = NULL;
-       // FIXME unchecked_malloc GDKmalloc can return NULL
        r = (InstrPtr*) GDKmalloc(sizeof(InstrPtr)* p->retc);
+       if(!r)
+               return;
        for(k=0; k < p->retc; k++) {
                r[k] = newInstruction(mb, matRef, packRef);
                getArg(r[k],0) = getArg(p,k);
@@ -455,13 +456,14 @@ mat_apply2(matlist_t *ml, MalBlkPtr mb, 
        GDKfree(r);
 }
 
-static void
+static int
 mat_apply3(MalBlkPtr mb, InstrPtr p, matlist_t *ml, int m, int n, int o, int 
mvar, int nvar, int ovar)
 {
        int k;
        InstrPtr *r = NULL;
-       // FIXME unchecked_malloc GDKmalloc can return NULL
        r = (InstrPtr*) GDKmalloc(sizeof(InstrPtr)* p->retc);
+       if(!r)
+               return -1;
        for(k=0; k < p->retc; k++) {
                r[k] = newInstruction(mb, matRef, packRef);
                getArg(r[k],0) = getArg(p,k);
@@ -489,6 +491,7 @@ mat_apply3(MalBlkPtr mb, InstrPtr p, mat
                pushInstruction(mb, r[k]);
        }
        GDKfree(r);
+       return 0;
 }
 
 static void
@@ -693,7 +696,7 @@ join_split(Client cntxt, InstrPtr p, int
  *
  * input is one list of arguments (just total length of mats) 
  */
-static void
+static int
 mat_joinNxM(Client cntxt, MalBlkPtr mb, InstrPtr p, matlist_t *ml, int args)
 {
        int tpe = getArgType(mb,p, 0), j,k, nr = 1;
@@ -703,6 +706,10 @@ mat_joinNxM(Client cntxt, MalBlkPtr mb, 
        int *mats = (int*)GDKzalloc(sizeof(int) * args); 
        int nr_mats = 0, first = 0;
 
+       if (!mats) {
+               return -1;
+       }
+
        for(j=0;j<args;j++) {
                mats[j] = is_a_mat(getArg(p,p->retc+j), ml);
                if (mats[j] != -1) {
@@ -725,7 +732,7 @@ mat_joinNxM(Client cntxt, MalBlkPtr mb, 
                if (split < 0) {
                        GDKfree(mats);
                        mb->errors++;
-                       return ;
+                       return 0;
                }
                /* now detect split point */
                for(k=1; k<mat[mv1].mi->argc; k++) {
@@ -776,6 +783,7 @@ mat_joinNxM(Client cntxt, MalBlkPtr mb, 
        mat_add(ml, l, mat_none, getFunctionId(p));
        mat_add(ml, r, mat_none, getFunctionId(p));
        GDKfree(mats);
+       return 0;
 }
 
 
@@ -1625,7 +1633,10 @@ OPTmergetableImplementation(Client cntxt
                                n = is_a_mat(getArg(p,p->retc+1), &ml);
                                mat_join2(mb, p, &ml, m, n);
                        } else {
-                               mat_joinNxM(cntxt, mb, p, &ml, bats);
+                               if ( mat_joinNxM(cntxt, mb, p, &ml, bats)) {
+                                       msg = 
createException(MAL,"optimizer.mergetable",MAL_MALLOC_FAIL);
+                                       goto cleanup;
+                               }
                        }
                        actions++;
                        continue;
@@ -1831,7 +1842,10 @@ OPTmergetableImplementation(Client cntxt
                   (n=is_a_mat(getArg(p,fn), &ml)) >= 0 &&
                   (o=is_a_mat(getArg(p,fo), &ml)) >= 0){
                        assert(ml.v[m].mi->argc == ml.v[n].mi->argc); 
-                       mat_apply3(mb, p, &ml, m, n, o, fm, fn, fo);
+                       if(mat_apply3(mb, p, &ml, m, n, o, fm, fn, fo)) {
+                               msg = 
createException(MAL,"optimizer.mergetable",MAL_MALLOC_FAIL);
+                               goto cleanup;
+                       }
                        actions++;
                        continue;
                }
diff --git a/sql/backends/monet5/UDF/pyapi/emit.c 
b/sql/backends/monet5/UDF/pyapi/emit.c
--- a/sql/backends/monet5/UDF/pyapi/emit.c
+++ b/sql/backends/monet5/UDF/pyapi/emit.c
@@ -138,8 +138,12 @@ PyObject *PyEmit_Emit(PyEmitObject *self
                if (potential_size > self->maxcols) {
                        // allocate space for new columns (if any new columns 
show up)
                        sql_emit_col *old = self->cols;
-                       // FIXME unchecked_malloc GDKmalloc can return NULL
                        self->cols = GDKzalloc(sizeof(sql_emit_col) * 
potential_size);
+                       if (self->cols == NULL) {
+                               PyErr_Format(PyExc_TypeError, "Out of memory 
error");
+                               error = true;
+                               goto wrapup;
+                       }
                        if (old) {
                                memcpy(self->cols, old, sizeof(sql_emit_col) * 
self->maxcols);
                                GDKfree(old);
diff --git a/sql/backends/monet5/rel_bin.c b/sql/backends/monet5/rel_bin.c
--- a/sql/backends/monet5/rel_bin.c
+++ b/sql/backends/monet5/rel_bin.c
@@ -1037,17 +1037,19 @@ rel_parse_value(backend *be, char *query
        int len = _strlen(query);
        exp_kind ek = {type_value, card_value, FALSE};
        stream *sr;
+       bstream *bs;
 
        m->qc = NULL;
 
        m->caching = 0;
        m->emode = emode;
        b = (buffer*)GDKmalloc(sizeof(buffer));
-       if (b == 0)
-               return sql_error(m, 02, MAL_MALLOC_FAIL);
        n = GDKmalloc(len + 1 + 1);
-       if (n == 0)
-               return sql_error(m, 02, MAL_MALLOC_FAIL);
+       if (b == NULL || n == NULL) {
+               GDKfree(b);
+               GDKfree(n);
+               return sql_error(m, 02, "HY001" MAL_MALLOC_FAIL);
+       }
        strncpy(n, query, len);
        query = n;
        query[len] = '\n';
@@ -1055,7 +1057,16 @@ rel_parse_value(backend *be, char *query
        len++;
        buffer_init(b, query, len);
        sr = buffer_rastream(b, "sqlstatement");
-       scanner_init(&m->scanner, bstream_create(sr, b->len), NULL);
+       if (sr == NULL) {
+               buffer_destroy(b);
+               return sql_error(m, 02, "HY001" MAL_MALLOC_FAIL);
+       }
+       bs = bstream_create(sr, b->len);
+       if(bs == NULL) {
+               buffer_destroy(b);
+               return sql_error(m, 02, "HY001" MAL_MALLOC_FAIL);
+       }
+       scanner_init(&m->scanner, bs, NULL);
        m->scanner.mode = LINE_1; 
        bstream_next(m->scanner.rs);
 
@@ -2844,10 +2855,10 @@ sql_parse(backend *be, sql_allocator *sa
 
        b = (buffer*)GDKmalloc(sizeof(buffer));
        if (b == 0)
-               return sql_error(m, 02, MAL_MALLOC_FAIL);
+               return sql_error(m, 02, "HY001" MAL_MALLOC_FAIL);
        n = GDKmalloc(len + 1 + 1);
        if (n == 0)
-               return sql_error(m, 02, MAL_MALLOC_FAIL);
+               return sql_error(m, 02, "HY001" MAL_MALLOC_FAIL);
        strncpy(n, query, len);
        query = n;
        query[len] = '\n';
@@ -2857,7 +2868,7 @@ sql_parse(backend *be, sql_allocator *sa
        buf = buffer_rastream(b, "sqlstatement");
        if(buf == NULL) {
                buffer_destroy(b);
-               return sql_error(m, 02, MAL_MALLOC_FAIL);
+               return sql_error(m, 02, "HY001" MAL_MALLOC_FAIL);
        }
        scanner_init( &m->scanner, bstream_create(buf, b->len), NULL);
        m->scanner.mode = LINE_1; 
@@ -2875,7 +2886,7 @@ sql_parse(backend *be, sql_allocator *sa
                GDKfree(query);
                GDKfree(b);
                bstream_destroy(m->scanner.rs);
-               return sql_error(m, 02, MAL_MALLOC_FAIL);
+               return sql_error(m, 02, "HY001" MAL_MALLOC_FAIL);
        }
 
        if (sqlparse(m) || !m->sym) {
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
@@ -935,8 +935,8 @@ backend_create_sql_func(backend *be, sql
        r = rel_parse(m, f->s, f->query, m_instantiate);
        if (r) {
                r = rel_optimizer(m, r);
-                r = rel_distribute(m, r);
-                r = rel_partition(m, r);
+               r = rel_distribute(m, r);
+               r = rel_partition(m, r);
        }
        if (r && !f->sql)       /* native function */
                return 0;
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
@@ -2114,20 +2114,21 @@ dump_export_header(mvc *sql, MalBlkPtr m
                const char *ntn = sql_escape_ident(tn);
                const char *nsn = sql_escape_ident(sn);
                size_t fqtnl;
-               char *fqtn;
+               char *fqtn = NULL;
 
                if (ntn && nsn && (fqtnl = strlen(ntn) + 1 + strlen(nsn) + 1) ){
-                       // FIXME unchecked_malloc NEW_ARRAY can return NULL
                        fqtn = NEW_ARRAY(char, fqtnl);
-                       snprintf(fqtn, fqtnl, "%s.%s", nsn, ntn);
-
-                       metaInfo(tblId,Str,fqtn);
-                       metaInfo(nmeId,Str,cn);
-                       metaInfo(tpeId,Str,(t->type->localtype == TYPE_void ? 
"char" : t->type->sqlname));
-                       metaInfo(lenId,Int,t->digits);
-                       metaInfo(scaleId,Int,t->scale);
-                       list = pushArgument(mb,list,c->nr);
-                       _DELETE(fqtn);
+                       if(fqtn) {
+                               snprintf(fqtn, fqtnl, "%s.%s", nsn, ntn);
+                               metaInfo(tblId, Str, fqtn);
+                               metaInfo(nmeId, Str, cn);
+                               metaInfo(tpeId, Str, (t->type->localtype == 
TYPE_void ? "char" : t->type->sqlname));
+                               metaInfo(lenId, Int, t->digits);
+                               metaInfo(scaleId, Int, t->scale);
+                               list = pushArgument(mb, list, c->nr);
+                               _DELETE(fqtn);
+                       } else
+                               q = NULL;
                } else
                        q = NULL;
                c_delete(ntn);
diff --git a/sql/common/sql_keyword.c b/sql/common/sql_keyword.c
--- a/sql/common/sql_keyword.c
+++ b/sql/common/sql_keyword.c
@@ -34,19 +34,23 @@ keyword_key(char *k, int *l)
        return (int) ((h & 0x80000000) ? ~h + 1 : h);
 }
 
-void
+int
 keywords_insert(char *k, int token)
 {
-       // FIXME unchecked_malloc MNEW can return NULL
        keyword *kw = MNEW(keyword);
-       int len = 0;
-       int bucket = keyword_key(k = toLower(k), &len) & HASH_MASK;
+       if(kw) {
+               int len = 0;
+               int bucket = keyword_key(k = toLower(k), &len) & HASH_MASK;
 
-       kw->keyword = k;
-       kw->len = len;
-       kw->token = token;
-       kw->next = keywords[bucket];
-       keywords[bucket] = kw;
+               kw->keyword = k;
+               kw->len = len;
+               kw->token = token;
+               kw->next = keywords[bucket];
+               keywords[bucket] = kw;
+               return 0;
+       } else {
+               return -1;
+       }
 }
 
 keyword *
diff --git a/sql/common/sql_stack.c b/sql/common/sql_stack.c
--- a/sql/common/sql_stack.c
+++ b/sql/common/sql_stack.c
@@ -13,11 +13,17 @@ sql_stack *
 sql_stack_new(sql_allocator *sa, int size)
 {
        sql_stack *s = SA_NEW(sa, sql_stack);
+       if (s == NULL)
+               return NULL;
 
        s -> sa = sa;
        s -> size = size;
        s -> top = 0;
-       s -> values = SA_NEW_ARRAY(sa, void*, size); 
+       s -> values = SA_NEW_ARRAY(sa, void*, size);
+       if (s->values == NULL) {
+               _DELETE(s);
+               return NULL;
+       }
        s -> values[s->top++] = NULL; 
        return s;
_______________________________________________
checkin-list mailing list
checkin-list@monetdb.org
https://www.monetdb.org/mailman/listinfo/checkin-list

Reply via email to