Changeset: 427583f8b136 for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/427583f8b136
Modified Files:
        gdk/gdk_logger.c
        sql/include/sql_catalog.h
        sql/storage/bat/bat_storage.c
        sql/storage/objectset.c
        sql/storage/store.c
        testing/suppres.txt
Branch: Jul2021
Log Message:

fixed use after free and leaks
only use early cleanup for objects which do no again have objectsets


diffs (269 lines):

diff --git a/gdk/gdk_logger.c b/gdk/gdk_logger.c
--- a/gdk/gdk_logger.c
+++ b/gdk/gdk_logger.c
@@ -2740,7 +2740,7 @@ new_logfile(logger *lg)
        p = (lng) getfilepos(getFile(lg->output_log));
        if (p == -1)
                return GDK_FAIL;
-       if (lg->drops > 100000 || p > log_large || (lg->end*1024) > log_large) {
+       if (((!lg->pending || !lg->pending->next) && lg->drops > 100000) || p > 
log_large || (lg->end*1024) > log_large) {
                lg->id++;
                logger_close_output(lg);
                return logger_open_output(lg);
diff --git a/sql/include/sql_catalog.h b/sql/include/sql_catalog.h
--- a/sql/include/sql_catalog.h
+++ b/sql/include/sql_catalog.h
@@ -235,7 +235,7 @@ typedef int (*tc_cleanup_fptr) (sql_stor
 typedef void (*destroy_fptr)(sql_store store, sql_base *b);
 typedef int (*validate_fptr)(struct sql_trans *tr, sql_base *b, int delete);
 
-extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool 
temporary, bool unique, bool concurrent, sql_store store);
+extern struct objectset *os_new(sql_allocator *sa, destroy_fptr destroy, bool 
temporary, bool unique, bool concurrent, bool nested, sql_store store);
 extern struct objectset *os_dup(struct objectset *os);
 extern void os_destroy(struct objectset *os, sql_store store);
 extern int /*ok, error (name existed) and conflict (added before) */ 
os_add(struct objectset *os, struct sql_trans *tr, const char *name, sql_base 
*b);
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
@@ -2932,6 +2932,8 @@ commit_destroy_del( sql_trans *tr, sql_c
        (void)change;
        (void)commit_ts;
        (void)oldest;
+       if (commit_ts)
+               change->handled = true;
        return 0;
 }
 
@@ -3336,6 +3338,8 @@ log_update_col( sql_trans *tr, sql_chang
 {
        sql_column *c = (sql_column*)change->obj;
 
+       if (isDeleted(c->t))
+               change->handled = true;
        if (!isDeleted(c->t) && !isTempTable(c->t) && !tr->parent) {/* don't 
write save point commits */
                storage *s = ATOMIC_PTR_GET(&c->t->data);
                return tr_log_delta(tr, c->t, ATOMIC_PTR_GET(&c->data), 
s->segs->h, c->base.id);
@@ -3407,7 +3411,7 @@ commit_update_col( sql_trans *tr, sql_ch
        sql_column *c = (sql_column*)change->obj;
        sql_delta *delta = ATOMIC_PTR_GET(&c->data);
 
-       if (isDeleted(c->t))
+       if (change->handled || isDeleted(c->t))
                return ok;
 
        if (isTempTable(c->t))
@@ -3447,6 +3451,8 @@ log_update_idx( sql_trans *tr, sql_chang
 {
        sql_idx *i = (sql_idx*)change->obj;
 
+       if (isDeleted(i->t))
+               change->handled = true;
        if (!isDeleted(i->t) && !isTempTable(i->t) && !tr->parent) { /* don't 
write save point commits */
                storage *s = ATOMIC_PTR_GET(&i->t->data);
                return tr_log_delta(tr, i->t, ATOMIC_PTR_GET(&i->data), 
s->segs->h, i->base.id);
@@ -3488,7 +3494,7 @@ commit_update_idx( sql_trans *tr, sql_ch
        sql_idx *i = (sql_idx*)change->obj;
        sql_delta *delta = ATOMIC_PTR_GET(&i->data);
 
-       if (isDeleted(i->t))
+       if (change->handled || isDeleted(i->t))
                return ok;
 
        if (isTempTable(i->t))
@@ -3547,6 +3553,8 @@ log_update_del( sql_trans *tr, sql_chang
 {
        sql_table *t = (sql_table*)change->obj;
 
+       if (isDeleted(t))
+               change->handled = true;
        if (!isDeleted(t) && !isTempTable(t) && !tr->parent) /* don't write 
save point commits */
                return log_storage(tr, t, ATOMIC_PTR_GET(&t->data), t->base.id);
        return LOG_OK;
@@ -3575,7 +3583,7 @@ commit_update_del( sql_trans *tr, sql_ch
        sql_table *t = (sql_table*)change->obj;
        storage *dbat = ATOMIC_PTR_GET(&t->data);
 
-       if (isDeleted(t))
+       if (change->handled || isDeleted(t))
                return ok;
 
        if (isTempTable(t)) {
@@ -3657,6 +3665,9 @@ gc_col( sqlstore *store, sql_change *cha
        if (!c) /* cleaned earlier */
                return 1;
 
+       if (change->handled || isDeleted(c->t))
+               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;
@@ -3711,6 +3722,9 @@ gc_idx( sqlstore *store, sql_change *cha
        if (!i) /* cleaned earlier */
                return 1;
 
+       if (change->handled || isDeleted(i->t))
+               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;
@@ -3763,6 +3777,8 @@ tc_gc_del( sql_store Store, sql_change *
        sqlstore *store = Store;
        sql_table *t = (sql_table*)change->obj;
 
+       if (change->handled || isDeleted(t))
+               return 1;
        (void)store;
        /* savepoint commit (did it merge ?) */
        if (ATOMIC_PTR_GET(&t->data) != change->data || isTempTable(t)) /* data 
is freed by commit */
diff --git a/sql/storage/objectset.c b/sql/storage/objectset.c
--- a/sql/storage/objectset.c
+++ b/sql/storage/objectset.c
@@ -62,7 +62,8 @@ typedef struct objectset {
        bool
                temporary:1,
                unique:1, /* names are unique */
-               concurrent:1;   /* concurrent inserts are allowed */
+               concurrent:1,   /* concurrent inserts are allowed */
+           nested:1;
        sql_store store;
 } objectset;
 
@@ -533,7 +534,8 @@ try_to_mark_deleted_for_destruction(sqls
                }
 
                ov->ts = store_get_timestamp(store)+1;
-               ov_destroy_obj_recursive(store, ov);
+               if (!ov->os->nested)
+                       ov_destroy_obj_recursive(store, ov);
        }
 }
 
@@ -640,7 +642,7 @@ tc_commit_objectversion(sql_trans *tr, s
 }
 
 objectset *
-os_new(sql_allocator *sa, destroy_fptr destroy, bool temporary, bool unique, 
bool concurrent, sql_store store)
+os_new(sql_allocator *sa, destroy_fptr destroy, bool temporary, bool unique, 
bool concurrent, bool nested, sql_store store)
 {
        objectset *os = SA_NEW(sa, objectset);
        *os = (objectset) {
@@ -650,6 +652,7 @@ os_new(sql_allocator *sa, destroy_fptr d
                .temporary = temporary,
                .unique = unique,
                .concurrent = concurrent,
+               .nested = nested,
                .store = store
        };
        os->destroy = destroy;
diff --git a/sql/storage/store.c b/sql/storage/store.c
--- a/sql/storage/store.c
+++ b/sql/storage/store.c
@@ -1060,14 +1060,14 @@ load_schema(sql_trans *tr, res_table *rt
                s->system = 
*(bte*)store->table_api.table_fetch_value(rt_schemas, find_sql_column(ss, 
"system"));
                s->owner = 
*(sqlid*)store->table_api.table_fetch_value(rt_schemas, find_sql_column(ss, 
"owner"));
 
-               s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, 
false, true, true, store);
-               s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, 
true, true, store);
-               s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, 
false, false, store);
-               s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, 
true, true, store);
-               s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, 
true, true, store);
-               s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, 
true, true, store);
-               s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, 
false, true, true, store);
-               s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, 
false, true, store);
+               s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, 
false, true, true, false, store);
+               s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, 
true, true, false, store);
+               s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, 
false, false, false, store);
+               s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, 
true, true, false, store);
+               s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, 
true, true, false, store);
+               s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, 
true, true, false, store);
+               s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, 
false, true, true, false, store);
+               s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, 
false, true, false, store);
        }
 
        TRC_DEBUG(SQL_STORE, "Load schema: %s %d\n", s->base.name, s->base.id);
@@ -1696,14 +1696,14 @@ bootstrap_create_schema(sql_trans *tr, c
        s->auth_id = auth_id;
        s->owner = owner;
        s->system = TRUE;
-       s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, false, true, 
true, store);
-       s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, true, 
true, store);
-       s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, false, 
false, store);
-       s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, true, 
true, store);
-       s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, true, 
true, store);
-       s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, true, 
true, store);
-       s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, false, 
true, true, store);
-       s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, false, 
true, store);
+       s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, false, true, 
true, false, store);
+       s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, false, true, 
true, false, store);
+       s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, false, false, 
false, false, store);
+       s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, false, true, 
true, false, store);
+       s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, false, true, 
true, false, store);
+       s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, false, true, 
true, false, store);
+       s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, false, 
true, true, false, store);
+       s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, false, false, 
true, false, store);
        if (os_add(tr->cat->schemas, tr, s->base.name, &s->base)) {
                return NULL;
        }
@@ -3629,8 +3629,8 @@ sql_trans_create_(sqlstore *store, sql_t
        tr->cat = store->cat;
        if (!tr->cat) {
                store->cat = tr->cat = SA_ZNEW(tr->sa, sql_catalog);
-               store->cat->schemas = os_new(tr->sa, (destroy_fptr) 
&schema_destroy, false, true, true, store);
-               store->cat->objects = os_new(tr->sa, (destroy_fptr) 
&key_destroy, false, false, true, store);
+               store->cat->schemas = os_new(tr->sa, (destroy_fptr) 
&schema_destroy, false, true, true, true, store);
+               store->cat->objects = os_new(tr->sa, (destroy_fptr) 
&key_destroy, false, false, true, false, store);
        }
        tr->tmp = store->tmp;
        TRC_DEBUG(SQL_STORE, "New transaction: %p\n", tr);
@@ -3650,12 +3650,12 @@ schema_dup(sql_trans *tr, sql_schema *s,
        ns->system = s->system;
 
        sqlstore *store = tr->store;
-       ns->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, 
isTempSchema(s), true, true, store);
-       ns->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, isTempSchema(s), 
true, true, store);
-       ns->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, isTempSchema(s), 
true, true, store);
-       ns->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, isTempSchema(s), 
true, true, store);
-       ns->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, 
isTempSchema(s), true, true, store);
-       ns->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, 
isTempSchema(s), false, true, store);
+       ns->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, 
isTempSchema(s), true, true, false, store);
+       ns->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, isTempSchema(s), 
true, true, false, store);
+       ns->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, isTempSchema(s), 
true, true, false, store);
+       ns->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, isTempSchema(s), 
true, true, false, store);
+       ns->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, 
isTempSchema(s), true, true, false, store);
+       ns->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, 
isTempSchema(s), false, true, false, store);
 
        /* table_dup will dup keys, idxs, triggers and parts */
        struct os_iter oi;
@@ -4897,14 +4897,14 @@ sql_trans_create_schema(sql_trans *tr, c
        s->auth_id = auth_id;
        s->owner = owner;
        s->system = FALSE;
-       s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, 
isTempSchema(s), true, true, store);
-       s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, 
isTempSchema(s), true, true, store);
-       s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, 
isTempSchema(s), false, false, store);
-       s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, isTempSchema(s), 
true, true, store);
-       s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, isTempSchema(s), 
true, true, store);
-       s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, isTempSchema(s), 
true, true, store);
-       s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, 
isTempSchema(s), true, true, store);
-       s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, 
isTempSchema(s), false, true, store);
+       s->tables = os_new(tr->sa, (destroy_fptr) &table_destroy, 
isTempSchema(s), true, true, false, store);
+       s->types = os_new(tr->sa, (destroy_fptr) &type_destroy, 
isTempSchema(s), true, true, false, store);
+       s->funcs = os_new(tr->sa, (destroy_fptr) &func_destroy, 
isTempSchema(s), false, false, false, store);
+       s->seqs = os_new(tr->sa, (destroy_fptr) &seq_destroy, isTempSchema(s), 
true, true, false, store);
+       s->keys = os_new(tr->sa, (destroy_fptr) &key_destroy, isTempSchema(s), 
true, true, false, store);
+       s->idxs = os_new(tr->sa, (destroy_fptr) &idx_destroy, isTempSchema(s), 
true, true, false, store);
+       s->triggers = os_new(tr->sa, (destroy_fptr) &trigger_destroy, 
isTempSchema(s), true, true, false, store);
+       s->parts = os_new(tr->sa, (destroy_fptr) &part_destroy, 
isTempSchema(s), false, true, false, store);
        s->store = tr->store;
 
        if ((res = store->table_api.table_insert(tr, sysschema, &s->base.id, 
&s->base.name, &s->auth_id, &s->owner, &s->system))) {
diff --git a/testing/suppres.txt b/testing/suppres.txt
--- a/testing/suppres.txt
+++ b/testing/suppres.txt
@@ -9,3 +9,4 @@ leak:PyThread_allocate_lock
 leak:*libpython*.so*
 leak:*cpython*.so*
 leak:*libgomp.so*
+leak:*libcrypto.so*
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to