Changeset: fa63e30f2da3 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/fa63e30f2da3
Modified Files:
sql/storage/bat/bat_storage.c
sql/storage/sql_storage.h
sql/storage/store.c
Branch: Jul2021
Log Message:
fixing leaks and use after free issues
diffs (163 lines):
diff --git a/sql/storage/bat/bat_storage.c b/sql/storage/bat/bat_storage.c
--- a/sql/storage/bat/bat_storage.c
+++ b/sql/storage/bat/bat_storage.c
@@ -2143,7 +2143,11 @@ log_destroy_col_(sql_trans *tr, sql_colu
static int
log_destroy_col(sql_trans *tr, sql_change *change)
{
- return log_destroy_col_(tr, (sql_column*)change->obj);
+ sql_column *c = (sql_column*)change->obj;
+ int res = log_destroy_col_(tr, c);
+ change->obj = NULL;
+ column_destroy(tr->store, c);
+ return res;
}
static int
@@ -2172,7 +2176,11 @@ log_destroy_idx_(sql_trans *tr, sql_idx
static int
log_destroy_idx(sql_trans *tr, sql_change *change)
{
- return log_destroy_idx_(tr, (sql_idx*)change->obj);
+ sql_idx *i = (sql_idx*)change->obj;
+ int res = log_destroy_idx_(tr, i);
+ change->obj = NULL;
+ idx_destroy(tr->store, i);
+ return res;
}
static int
@@ -2248,25 +2256,19 @@ drop_del(sql_trans *tr, sql_table *t)
static int
drop_col(sql_trans *tr, sql_column *c)
{
- int ok = LOG_OK;
-
- if (!isNew(c) && !isTempTable(c->t)) {
- sql_delta *d = ATOMIC_PTR_GET(&c->data);
- trans_add(tr, &c->base, d, &tc_gc_col, &commit_destroy_del,
&log_destroy_col);
- }
- return ok;
+ assert(!isNew(c) && !isTempTable(c->t));
+ sql_delta *d = ATOMIC_PTR_GET(&c->data);
+ trans_add(tr, &c->base, d, &tc_gc_col, &commit_destroy_del,
&log_destroy_col);
+ return LOG_OK;
}
static int
drop_idx(sql_trans *tr, sql_idx *i)
{
- int ok = LOG_OK;
-
- if (!isNew(i) && !isTempTable(i->t)) {
- sql_delta *d = ATOMIC_PTR_GET(&i->data);
- trans_add(tr, &i->base, d, &tc_gc_idx, &commit_destroy_del,
&log_destroy_idx);
- }
- return ok;
+ assert(!isNew(i) && !isTempTable(i->t));
+ sql_delta *d = ATOMIC_PTR_GET(&i->data);
+ trans_add(tr, &i->base, d, &tc_gc_idx, &commit_destroy_del,
&log_destroy_idx);
+ return LOG_OK;
}
@@ -2897,6 +2899,9 @@ tc_gc_col( sql_store Store, sql_change *
(void)Store;
sql_column *c = (sql_column*)change->obj;
+ if (!c) /* cleaned earlier */
+ return 1;
+
/* savepoint commit (did it merge ?) */
if (ATOMIC_PTR_GET(&c->data) != change->data || isTempTable(c->t)) /*
data is freed by commit */
return 1;
@@ -2919,6 +2924,9 @@ tc_gc_idx( sql_store Store, sql_change *
(void)Store;
sql_idx *i = (sql_idx*)change->obj;
+ if (!i) /* cleaned earlier */
+ return 1;
+
/* savepoint commit (did it merge ?) */
if (ATOMIC_PTR_GET(&i->data) != change->data || isTempTable(i->t)) /*
data is freed by commit */
return 1;
diff --git a/sql/storage/sql_storage.h b/sql/storage/sql_storage.h
--- a/sql/storage/sql_storage.h
+++ b/sql/storage/sql_storage.h
@@ -365,6 +365,10 @@ extern int sql_trans_is_duplicate_elimin
extern size_t sql_trans_dist_count(sql_trans *tr, sql_column *col);
extern int sql_trans_ranges(sql_trans *tr, sql_column *col, char **min, char
**max);
+extern void column_destroy(struct sqlstore *store, sql_column *c);
+extern void idx_destroy(struct sqlstore *store, sql_idx * i);
+extern void table_destroy(struct sqlstore *store, sql_table *t);
+
extern sql_key *sql_trans_create_ukey(sql_trans *tr, sql_table *t, const char
*name, key_type kt);
extern sql_key * sql_trans_key_done(sql_trans *tr, sql_key *k);
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -139,7 +139,7 @@ key_destroy(sqlstore *store, sql_key *k)
_DELETE(k);
}
-static void
+void
idx_destroy(sqlstore *store, sql_idx * i)
{
assert(i->base.refcnt > 0);
@@ -173,7 +173,7 @@ trigger_destroy(sqlstore *store, sql_tri
_DELETE(t);
}
-static void
+void
column_destroy(sqlstore *store, sql_column *c)
{
assert(c->base.refcnt > 0);
@@ -195,7 +195,7 @@ int_destroy(sqlstore *store, int *v)
_DELETE(v);
}
-static void
+void
table_destroy(sqlstore *store, sql_table *t)
{
assert(t->base.refcnt > 0);
@@ -5335,12 +5335,12 @@ sql_trans_drop_column(sql_trans *tr, sql
if ((res = sys_drop_column(tr, col, drop_action)))
return res;
+ if (!isNew(col) && !isTempTable(col->t))
+ if (store->storage_api.drop_col(tr,
(sql_column*)dup_base(&col->base)) != LOG_OK)
+ return -3;
+
ol_del(t->columns, store, n);
- if (!isNew(col))
- if (store->storage_api.drop_col(tr, col) != LOG_OK)
- return -3;
-
if (drop_action == DROP_CASCADE_START && tr->dropped) {
list_destroy(tr->dropped);
tr->dropped = NULL;
@@ -5951,14 +5951,14 @@ sql_trans_drop_idx(sql_trans *tr, sql_sc
if (!isTempTable(i->t) && (res = sys_drop_idx(tr, i, drop_action)))
return res;
+ if (!isNew(i) && !isTempTable(i->t))
+ if (store->storage_api.drop_idx(tr,
(sql_idx*)dup_base(&i->base)) != LOG_OK)
+ return -3;
+
node *n = ol_find_name(i->t->idxs, i->base.name);
if (n)
ol_del(i->t->idxs, store, n);
- if (!isNew(i))
- if (store->storage_api.drop_idx(tr, i) != LOG_OK)
- return -3;
-
if (drop_action == DROP_CASCADE_START && tr->dropped) {
list_destroy(tr->dropped);
tr->dropped = NULL;
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list