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

Reply via email to