From aafbd9334ca0ea78b6283268eaba418196bda6c1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Al=D0=B5x=D0=B0nder=20Lysik=D0=BEv?=
 <alexander.lysikov@demlabs.net>
Date: Fri, 23 Aug 2019 11:33:03 +0500
Subject: [PATCH] fixed memory leaks in dap_db_history_add() added support the
 table name containing '.' in sqlite_driver

---
 dap_chain_global_db.c               |  4 ++--
 dap_chain_global_db_driver_sqlite.c | 30 +++++++++++++++++++++++++----
 dap_chain_global_db_hist.c          |  1 +
 3 files changed, 29 insertions(+), 6 deletions(-)

diff --git a/dap_chain_global_db.c b/dap_chain_global_db.c
index f28b49d..4b54fcf 100755
--- a/dap_chain_global_db.c
+++ b/dap_chain_global_db.c
@@ -331,8 +331,8 @@ bool dap_chain_global_db_gr_del(const char *a_key, const char *a_group)
     if(!a_key)
         return NULL;
     pdap_store_obj_t store_data = DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(struct dap_store_obj));
-    store_data->key = dap_strdup(a_key);
-    store_data->group = dap_strdup(a_group);
+    store_data->key = a_key;
+    store_data->group = a_group;
     lock();
     int l_res = dap_chain_global_db_driver_delete(store_data, 1);
     unlock();
diff --git a/dap_chain_global_db_driver_sqlite.c b/dap_chain_global_db_driver_sqlite.c
index 6265062..990bda5 100755
--- a/dap_chain_global_db_driver_sqlite.c
+++ b/dap_chain_global_db_driver_sqlite.c
@@ -439,6 +439,22 @@ int dap_db_driver_sqlite_end_transaction(void)
         return -1;
 }
 
+char *dap_db_driver_sqlite_make_table_name(const char *a_group_name)
+{
+    char *l_group_name = dap_strdup(a_group_name);
+    ssize_t l_group_name_len = dap_strlen(l_group_name);
+    const char *l_needle = ".";
+    // replace '.' to '_'
+    while(1){
+    char *l_str = dap_strstr_len(l_group_name, l_group_name_len, l_needle);
+    if(l_str)
+        *l_str = '_';
+    else
+        break;
+    }
+    return l_group_name;
+}
+
 /**
  * Apply data (write or delete)
  *
@@ -455,11 +471,13 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
         //dap_chain_hash_fast_t l_hash;
         //dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash);
 
-        char *l_blob_hash = ""; //dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t));
+        char *l_blob_hash = "";//dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t));
         char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, a_store_obj->value_len);
         //add one record
+        char *table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group);
         l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'%s', '%lld', x'%s')",
-                a_store_obj->group, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value);
+                table_name, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value);
+        DAP_DELETE(table_name);
         //dap_db_driver_sqlite_free(l_blob_hash);
         dap_db_driver_sqlite_free(l_blob_value);
     }
@@ -482,7 +500,9 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
         dap_db_driver_sqlite_free(l_error_message);
         l_error_message = NULL;
         // create table
-        dap_db_driver_sqlite_create_group_table(a_store_obj->group);
+        char *table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group);
+        dap_db_driver_sqlite_create_group_table(table_name);
+        DAP_DELETE(table_name);
         // repeat request
         l_ret = dap_db_driver_sqlite_exec(s_db, l_query, &l_error_message);
 
@@ -491,9 +511,11 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj)
     if(l_ret == SQLITE_CONSTRAINT) {
         dap_db_driver_sqlite_free(l_error_message);
         l_error_message = NULL;
+        char *table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group);
         //delete exist record
-        char *l_query_del = sqlite3_mprintf("delete from '%s' where key = '%s'", a_store_obj->group, a_store_obj->key);
+        char *l_query_del = sqlite3_mprintf("delete from '%s' where key = '%s'", table_name, a_store_obj->key);
         l_ret = dap_db_driver_sqlite_exec(s_db, l_query_del, &l_error_message);
+        DAP_DELETE(table_name);
         dap_db_driver_sqlite_free(l_query_del);
         if(l_ret != SQLITE_OK) {
             log_it(L_INFO, "Entry with the same key is already present and can't delete, %s", l_error_message);
diff --git a/dap_chain_global_db_hist.c b/dap_chain_global_db_hist.c
index b1ca5b4..3ac5ff0 100755
--- a/dap_chain_global_db_hist.c
+++ b/dap_chain_global_db_hist.c
@@ -1103,6 +1103,7 @@ bool dap_db_history_add(char a_type, pdap_store_obj_t a_store_obj, size_t a_dap_
     int l_res = dap_chain_global_db_driver_add(&l_store_data, 1);
     if(l_rec.keys_count > 1)
         DAP_DELETE(l_rec.keys);
+    DAP_DELETE(l_store_data.value);
     DAP_DELETE(l_str);
     if(!l_res)
         return true;
-- 
GitLab