From a2fc90dfb3b884362e744a81b05b461a90ac0620 Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Fri, 27 Aug 2021 11:50:23 +0000
Subject: [PATCH] bugs-4854

---
 CMakeLists.txt                                |  2 +-
 dap-sdk/core/include/dap_common.h             |  1 +
 dap-sdk/core/src/dap_common.c                 |  7 ++++
 dap-sdk/net/core/dap_worker.c                 |  3 ++
 dap-sdk/net/stream/stream/dap_stream.c        |  4 ++
 dap-sdk/net/stream/stream/dap_stream_pkt.c    | 21 ++++++----
 modules/channel/chain/dap_stream_ch_chain.c   |  5 ++-
 modules/global-db/dap_chain_global_db.c       |  2 +-
 .../global-db/include/dap_chain_global_db.h   |  2 +-
 modules/net/dap_chain_node_client.c           | 41 ++++++++++---------
 .../xchange/dap_chain_net_srv_xchange.c       |  1 +
 11 files changed, 57 insertions(+), 32 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index 65b2d63e03..5afcabf322 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -2,7 +2,7 @@ project(cellframe-sdk C)
 cmake_minimum_required(VERSION 3.0)
 
 set(CMAKE_C_STANDARD 11)
-set(CELLFRAME_SDK_NATIVE_VERSION "2.9-31")
+set(CELLFRAME_SDK_NATIVE_VERSION "2.9-32")
 add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"")
 set(DAPSDK_MODULES "")
 message("Cellframe modules: ${CELLFRAME_MODULES}")
diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h
index ffdb565ef9..7baa879248 100755
--- a/dap-sdk/core/include/dap_common.h
+++ b/dap-sdk/core/include/dap_common.h
@@ -462,6 +462,7 @@ void dap_digit_from_string2(const char *num_str, void *raw, size_t raw_len);
 
 void *dap_interval_timer_create(unsigned int a_msec, dap_timer_callback_t a_callback, void *a_param);
 int dap_interval_timer_delete(void *a_timer);
+void dap_interval_timer_deinit();
 
 uint16_t dap_lendian_get16(const uint8_t *a_buf);
 void dap_lendian_put16(uint8_t *a_buf, uint16_t a_val);
diff --git a/dap-sdk/core/src/dap_common.c b/dap-sdk/core/src/dap_common.c
index 2ccceb609d..0a7aa08e40 100755
--- a/dap-sdk/core/src/dap_common.c
+++ b/dap-sdk/core/src/dap_common.c
@@ -845,6 +845,13 @@ static CRITICAL_SECTION s_timers_lock;
 static pthread_mutex_t s_timers_lock;
 #endif
 
+void dap_interval_timer_deinit()
+{
+    for (int i = 0; i < s_timers_count; i++) {
+        dap_interval_timer_delete(s_timers[i].timer);
+    }
+}
+
 static int s_timer_find(void *a_timer)
 {
     for (int i = 0; i < s_timers_count; i++) {
diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c
index 3ae110aa85..044b8ec765 100644
--- a/dap-sdk/net/core/dap_worker.c
+++ b/dap-sdk/net/core/dap_worker.c
@@ -1081,6 +1081,9 @@ static void s_queue_es_io_callback( dap_events_socket_t * a_es, void * a_arg)
         dap_events_socket_set_writable_unsafe(l_msg_es, false);
     if (l_msg->data_size && l_msg->data)
         dap_events_socket_write_unsafe(l_msg_es, l_msg->data,l_msg->data_size);
+    if (l_msg->data) {
+        DAP_DELETE(l_msg->data);
+    }
     DAP_DELETE(l_msg);
 }
 
diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c
index ba48ef50dc..c5d030a77e 100644
--- a/dap-sdk/net/stream/stream/dap_stream.c
+++ b/dap-sdk/net/stream/stream/dap_stream.c
@@ -623,6 +623,10 @@ size_t dap_stream_data_proc_read (dap_stream_t *a_stream)
         }else{
             read_bytes_to=bytes_left_to_read;
         }
+        if (a_stream->pkt_buf_in_data_size + read_bytes_to > a_stream->pkt_buf_in_size_expected) {
+            a_stream->pkt_buf_in_size_expected = a_stream->pkt_buf_in_data_size + read_bytes_to;
+            a_stream->pkt_buf_in = (dap_stream_pkt_t *)DAP_REALLOC(a_stream->pkt_buf_in, a_stream->pkt_buf_in_size_expected);
+        }
         memcpy((uint8_t*)a_stream->pkt_buf_in+a_stream->pkt_buf_in_data_size,proc_data,read_bytes_to);
         a_stream->pkt_buf_in_data_size+=read_bytes_to;
         bytes_left_to_read-=read_bytes_to;
diff --git a/dap-sdk/net/stream/stream/dap_stream_pkt.c b/dap-sdk/net/stream/stream/dap_stream_pkt.c
index 91f00ff187..39e56a109d 100644
--- a/dap-sdk/net/stream/stream/dap_stream_pkt.c
+++ b/dap-sdk/net/stream/stream/dap_stream_pkt.c
@@ -70,20 +70,23 @@ dap_stream_pkt_t * dap_stream_pkt_detect(void * a_data, size_t data_size)
     size_t length_left=data_size;
 
     while( (sig_start=memchr(sig_start, c_dap_stream_sig[0],length_left)) != NULL ){
-        length_left= data_size- (size_t)  ( sig_start- (uint8_t *) a_data);
+        length_left = data_size - (size_t)(sig_start - (uint8_t *)a_data);
         if(length_left < sizeof(c_dap_stream_sig) )
             break;
         if(memcmp(sig_start,c_dap_stream_sig,sizeof(c_dap_stream_sig))==0){
-            ret= (dap_stream_pkt_t*) sig_start;
-            if(length_left>= sizeof (dap_stream_ch_pkt_t) ){
-                if(ret->hdr.size > STREAM_PKT_SIZE_MAX ){
-                    log_it(L_ERROR, "Too big packet size %u",ret->hdr.size);
-                    ret=NULL;
-                }
+            ret = (dap_stream_pkt_t *)sig_start;
+            if (length_left < sizeof(dap_stream_ch_pkt_hdr_t)) {
+                log_it(L_ERROR, "Too small packet size %u", length_left);
+                ret = NULL;
+                break;
+            }
+            if(ret->hdr.size > STREAM_PKT_SIZE_MAX ){
+                log_it(L_ERROR, "Too big packet size %u",ret->hdr.size);
+                ret = NULL;
             }
             break;
-        }else
-        sig_start+=1;
+        } else
+            sig_start++;
     }
 
     return ret;
diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c
index a567e3ac4f..7e6fd0b55d 100644
--- a/modules/channel/chain/dap_stream_ch_chain.c
+++ b/modules/channel/chain/dap_stream_ch_chain.c
@@ -397,7 +397,7 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar
     // Get log diff
     uint64_t l_local_last_id = dap_db_log_get_last_id();
     if (s_debug_more)
-        log_it(L_DEBUG, "Sync out gdb proc, requested transactions %"DAP_UINT64_FORMAT_U":%"DAP_UINT64_FORMAT_U" from address "NODE_ADDR_FP_STR,
+        log_it(L_DEBUG, "Sync out gdb proc, requested transactions %"DAP_UINT64_FORMAT_u":%"DAP_UINT64_FORMAT_u" from address "NODE_ADDR_FP_STR,
                             l_sync_request->request.id_start, l_local_last_id, NODE_ADDR_FP_ARGS_S(l_sync_request->request.node_addr));
     uint64_t l_start_item = l_sync_request->request.id_start;
     // If the current global_db has been truncated, but the remote node has not known this
@@ -706,6 +706,9 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg)
     } else {
         log_it(L_WARNING, "In proc thread got GDB stream ch packet with zero data");
     }
+    if (l_pkt_item->pkt_data) {
+        DAP_DELETE(l_pkt_item->pkt_data);
+    }
     DAP_DELETE(l_sync_request);
     return true;
 }
diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c
index be3170fe13..4a6ca4f938 100644
--- a/modules/global-db/dap_chain_global_db.c
+++ b/modules/global-db/dap_chain_global_db.c
@@ -481,7 +481,7 @@ time_t global_db_gr_del_get_timestamp(const char *a_group, char *a_key)
  * @details Set one entry to base. IMPORTANT: a_key and a_value should be passed without free after (it will be released by gdb itself)
  * @return
  */
-bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len,  const char *a_group)
+bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len, const char *a_group)
 {
     dap_store_obj_t store_data;// = DAP_NEW_Z_SIZE(dap_store_obj_t, sizeof(struct dap_store_obj));
     memset(&store_data, 0, sizeof(dap_store_obj_t));
diff --git a/modules/global-db/include/dap_chain_global_db.h b/modules/global-db/include/dap_chain_global_db.h
index 8020f13882..807ca35db6 100644
--- a/modules/global-db/include/dap_chain_global_db.h
+++ b/modules/global-db/include/dap_chain_global_db.h
@@ -76,7 +76,7 @@ uint8_t * dap_chain_global_db_get(const char *a_key, size_t *a_data_out);
 /**
  * Set one entry to base
  */
-bool dap_chain_global_db_gr_set(char *a_key,  void *a_value, size_t a_value_len,const char *a_group);
+bool dap_chain_global_db_gr_set(char *a_key,  void *a_value, size_t a_value_len, const char *a_group);
 bool dap_chain_global_db_set( char *a_key, void *a_value, size_t a_value_len);
 
 /**
diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c
index 829e078c69..9332f04a13 100644
--- a/modules/net/dap_chain_node_client.c
+++ b/modules/net/dap_chain_node_client.c
@@ -206,25 +206,28 @@ static bool s_timer_update_states_callback(void * a_arg )
         if (l_client ) {
             dap_chain_node_client_t * l_node_client = (dap_chain_node_client_t*) l_client->_inheritor;
             if (l_node_client && l_node_client->ch_chain) {
-                dap_stream_ch_chain_t * l_ch_chain = (dap_stream_ch_chain_t*) l_node_client->ch_chain->internal;
-                assert(l_ch_chain);
-                dap_chain_net_t * l_net = l_node_client->net;
-                assert(l_net);
-
-                // If we do nothing - init sync process
-                if (l_ch_chain->state == CHAIN_STATE_IDLE ||l_ch_chain->state == CHAIN_STATE_SYNC_ALL ){
-                    dap_stream_ch_chain_sync_request_t l_sync_gdb = {};
-                    l_sync_gdb.id_start = (uint64_t) dap_db_get_last_id_remote(l_node_client->remote_node_addr.uint64);
-                    l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
-                    log_it(L_DEBUG, "Prepared request to gdb sync from %"DAP_UINT64_FORMAT_U" to %"DAP_UINT64_FORMAT_U"", l_sync_gdb.id_start,
-                           l_sync_gdb.id_end?l_sync_gdb.id_end:-1 );
-                    // find dap_chain_id_t
-                    dap_chain_t *l_chain = l_net->pub.chains;
-                    dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t ) {0};
-                    dap_stream_ch_chain_pkt_write_unsafe( l_node_client->ch_chain ,
-                                                      DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ, l_net->pub.id.uint64,
-                                                                    l_chain_id.uint64, l_net->pub.cell_id.uint64,
-                                                          &l_sync_gdb, sizeof(l_sync_gdb));
+                dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(l_node_client->stream_worker, l_node_client->ch_chain_uuid);
+                if (l_ch) {
+                    dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch);
+                    assert(l_ch_chain);
+                    dap_chain_net_t * l_net = l_node_client->net;
+                    assert(l_net);
+
+                    // If we do nothing - init sync process
+                    if (l_ch_chain->state == CHAIN_STATE_IDLE ||l_ch_chain->state == CHAIN_STATE_SYNC_ALL ){
+                        dap_stream_ch_chain_sync_request_t l_sync_gdb = {};
+                        l_sync_gdb.id_start = (uint64_t) dap_db_get_last_id_remote(l_node_client->remote_node_addr.uint64);
+                        l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net);
+                        log_it(L_DEBUG, "Prepared request to gdb sync from %"DAP_UINT64_FORMAT_U" to %"DAP_UINT64_FORMAT_U"", l_sync_gdb.id_start,
+                               l_sync_gdb.id_end?l_sync_gdb.id_end:-1 );
+                        // find dap_chain_id_t
+                        dap_chain_t *l_chain = l_net->pub.chains;
+                        dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t ) {0};
+                        dap_stream_ch_chain_pkt_write_unsafe( l_node_client->ch_chain ,
+                                                          DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ, l_net->pub.id.uint64,
+                                                                        l_chain_id.uint64, l_net->pub.cell_id.uint64,
+                                                              &l_sync_gdb, sizeof(l_sync_gdb));
+                    }
                 }
                 return true;
             }
diff --git a/modules/service/xchange/dap_chain_net_srv_xchange.c b/modules/service/xchange/dap_chain_net_srv_xchange.c
index 65a223b7ba..eb27c36403 100644
--- a/modules/service/xchange/dap_chain_net_srv_xchange.c
+++ b/modules/service/xchange/dap_chain_net_srv_xchange.c
@@ -74,6 +74,7 @@ int dap_chain_net_srv_xchange_init()
                                                        s_callback_response_error, s_callback_receipt_next_success);
     s_srv_xchange = DAP_NEW_Z(dap_chain_net_srv_xchange_t);
     l_srv->_inhertor = s_srv_xchange;
+    s_srv_xchange->parent = l_srv;
     s_srv_xchange->enabled = false;
     size_t l_prices_count = 0;
     dap_global_db_obj_t *l_prices = dap_chain_global_db_gr_load(GROUP_LOCAL_XCHANGE, &l_prices_count);
-- 
GitLab