Changeset: a1aeb1474572 for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=a1aeb1474572 Modified Files: monetdb5/modules/atoms/json.c monetdb5/modules/kernel/batmmath.c monetdb5/modules/mal/pcre.c sql/backends/monet5/datacell/basket.c sql/backends/monet5/sql.c sql/storage/bat/bat_logger.c Branch: default Log Message:
Check more result of BATnew. diffs (216 lines): diff --git a/monetdb5/modules/atoms/json.c b/monetdb5/modules/atoms/json.c --- a/monetdb5/modules/atoms/json.c +++ b/monetdb5/modules/atoms/json.c @@ -1127,6 +1127,8 @@ JSONkeyTable(int *ret, json *js) jt= JSONparse(*js, TRUE); // already validated bn = BATnew(TYPE_void, TYPE_str, 64, TRANSIENT); + if (bn == NULL) + throw(MAL, "json.keys", MAL_MALLOC_FAIL); BATseqbase(bn, 0); bn->hsorted = 1; bn->hrevsorted = 0; @@ -1180,6 +1182,8 @@ JSONvalueTable(int *ret, json *js) jt= JSONparse(*js, TRUE); // already validated bn = BATnew(TYPE_void, TYPE_str, 64, TRANSIENT); + if (bn == NULL) + throw(MAL, "json.values", MAL_MALLOC_FAIL); BATseqbase(bn, 0); bn->hsorted = 1; bn->hrevsorted = 0; diff --git a/monetdb5/modules/kernel/batmmath.c b/monetdb5/modules/kernel/batmmath.c --- a/monetdb5/modules/kernel/batmmath.c +++ b/monetdb5/modules/kernel/batmmath.c @@ -33,6 +33,7 @@ #define voidresultBAT(X1,X2)\ bn = BATnew(TYPE_void, X1, BATcount(b), TRANSIENT);\ if (bn == NULL) {\ + BBPreleaseref(b->batCacheid);\ throw(MAL, X2, MAL_MALLOC_FAIL);\ }\ BATseqbase(bn, b->hseqbase);\ diff --git a/monetdb5/modules/mal/pcre.c b/monetdb5/modules/mal/pcre.c --- a/monetdb5/modules/mal/pcre.c +++ b/monetdb5/modules/mal/pcre.c @@ -627,6 +627,7 @@ pcre_select(BAT **res, const char *patte if (r == NULL) throw(MAL, "pcre_select", MAL_MALLOC_FAIL); if ((re = pcre_compile(pattern, options, &err_p, &errpos, NULL)) == NULL) { + BBPreclaim(r); throw(MAL, "pcre_select", OPERATION_FAILED "pcre compile of pattern (%s) failed at %d with\n'%s'.", pattern, errpos, err_p); } diff --git a/sql/backends/monet5/datacell/basket.c b/sql/backends/monet5/datacell/basket.c --- a/sql/backends/monet5/datacell/basket.c +++ b/sql/backends/monet5/datacell/basket.c @@ -147,20 +147,47 @@ BSKTnewbasket(sql_schema *s, sql_table * baskets[idx].cols = GDKzalloc((baskets[idx].colcount + 1) * sizeof(str)); baskets[idx].primary = GDKzalloc((baskets[idx].colcount + 1) * sizeof(BAT *)); baskets[idx].errors = BATnew(TYPE_void, TYPE_str, BATTINY, TRANSIENT); + if (baskets[idx].name == NULL || + baskets[idx].cols == NULL || + baskets[idx].primary == NULL || + baskets[idx].errors == NULL) { + msg = MAL_MALLOC_FAIL; + goto bailout; + } i = 0; - for (o = t->columns.set->h; msg == MAL_SUCCEED && o; o = o->next) { + for (o = t->columns.set->h; o; o = o->next) { c = o->data; b = store_funcs.bind_col(tr, c, 0); if (b == NULL) { - MT_lock_unset(&mal_contextLock, "register"); - throw(SQL, "sql.basket", "Can not access descriptor"); + msg = "Can not access descriptor"; + goto bailout; } baskets[idx].primary[i] = b; - baskets[idx].cols[i++] = GDKstrdup(c->base.name); + if ((baskets[idx].cols[i++] = GDKstrdup(c->base.name)) == NULL) { + msg = MAL_MALLOC_FAIL; + goto bailout; + } } MT_lock_unset(&mal_contextLock, "register"); return MAL_SUCCEED; + + bailout: + GDKfree(baskets[idx].name); + baskets[idx].name = NULL; + if (baskets[idx].cols) { + for (i = 0; i < baskets[idx].colcount; i++) + GDKfree(baskets[idx].cols[i]); + GDKfree(baskets[idx].cols); + baskets[idx].cols = NULL; + } + GDKfree(baskets[idx].primary); + baskets[idx].primary = NULL; + BBPreclaim(baskets[idx].errors); + baskets[idx].errors = NULL; + MT_lock_destroy(&baskets[idx].lock); + MT_lock_unset(&mal_contextLock, "register"); + throw(SQL, "sql.basket", "%s", msg); } str 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 @@ -4603,6 +4603,10 @@ BATSTRindex_int(bat *res, bat *src, bit int v; r = BATnew(TYPE_void, TYPE_int, 1024, TRANSIENT); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", MAL_MALLOC_FAIL); + } BATseqbase(r, 0); pos = GDK_STRHASHSIZE; while (pos < h->free) { @@ -4619,6 +4623,10 @@ BATSTRindex_int(bat *res, bat *src, bit } } else { r = VIEWcreate(s, s); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", MAL_MALLOC_FAIL); + } r->ttype = TYPE_int; r->tvarsized = 0; r->T->vheap = NULL; @@ -4651,6 +4659,10 @@ BATSTRindex_sht(bat *res, bat *src, bit sht v; r = BATnew(TYPE_void, TYPE_sht, 1024, TRANSIENT); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", MAL_MALLOC_FAIL); + } BATseqbase(r, 0); pos = GDK_STRHASHSIZE; while (pos < h->free) { @@ -4667,6 +4679,10 @@ BATSTRindex_sht(bat *res, bat *src, bit } } else { r = VIEWcreate(s, s); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", MAL_MALLOC_FAIL); + } r->ttype = TYPE_sht; r->tvarsized = 0; r->T->vheap = NULL; @@ -4699,6 +4715,10 @@ BATSTRindex_bte(bat *res, bat *src, bit bte v; r = BATnew(TYPE_void, TYPE_bte, 64, TRANSIENT); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", MAL_MALLOC_FAIL); + } BATseqbase(r, 0); pos = GDK_STRHASHSIZE; while (pos < h->free) { @@ -4715,6 +4735,10 @@ BATSTRindex_bte(bat *res, bat *src, bit } } else { r = VIEWcreate(s, s); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.index", MAL_MALLOC_FAIL); + } r->ttype = TYPE_bte; r->tvarsized = 0; r->T->vheap = NULL; @@ -4746,6 +4770,10 @@ BATSTRstrings(bat *res, bat *src) h = s->T->vheap; extralen = h->hashash ? EXTRALEN : 0; r = BATnew(TYPE_void, TYPE_str, 1024, TRANSIENT); + if (r == NULL) { + BBPunfix(s->batCacheid); + throw(SQL, "calc.strings", MAL_MALLOC_FAIL); + } BATseqbase(r, 0); pos = GDK_STRHASHSIZE; while (pos < h->free) { diff --git a/sql/storage/bat/bat_logger.c b/sql/storage/bat/bat_logger.c --- a/sql/storage/bat/bat_logger.c +++ b/sql/storage/bat/bat_logger.c @@ -91,9 +91,9 @@ bl_postversion( void *lg) return; bi = bat_iterator(b); b1 = BATnew(TYPE_void, TYPE_bit, BATcount(b), PERSISTENT); - BATseqbase(b1, b->hseqbase); if (!b1) return; + BATseqbase(b1, b->hseqbase); /* only sys and tmp are system schemas */ for(p=BUNfirst(b), q=BUNlast(b); p<q; p++) { bit v = FALSE; @@ -113,9 +113,9 @@ bl_postversion( void *lg) return; bi = bat_iterator(b); b1 = BATnew(TYPE_void, TYPE_bit, BATcount(b), PERSISTENT); - BATseqbase(b1, b->hseqbase); if (!b1) return; + BATseqbase(b1, b->hseqbase); /* default to ARG_IN, names starting with 'res' are ARG_OUT */ bi = bat_iterator(b); for(p=BUNfirst(b), q=BUNlast(b); p<q; p++) { @@ -137,10 +137,10 @@ bl_postversion( void *lg) bi = bat_iterator(b); b1 = BATnew(TYPE_void, TYPE_bit, BATcount(b), PERSISTENT); b2 = BATnew(TYPE_void, TYPE_bit, BATcount(b), PERSISTENT); + if (!b1 || !b2) + return; BATseqbase(b1, b->hseqbase); BATseqbase(b2, b->hseqbase); - if (!b1 || !b2) - return; /* default to no variaable arguments and results */ for(p=BUNfirst(b), q=BUNlast(b); p<q; p++) { bit v = FALSE; _______________________________________________ checkin-list mailing list checkin-list@monetdb.org https://www.monetdb.org/mailman/listinfo/checkin-list