diff --git a/CMakeLists.txt b/CMakeLists.txt index 65b2d63e03a6ae94f58bcbb2bd0277b5eeac1639..5afcabf322971ccc68b89927d5e124e273c2f2cd 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 ffdb565ef9668107148cd160b08ad994446e7a1f..7baa879248bd5fb824dfcaaf99ee5521e7dc1698 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 2ccceb609d4b81dbf1eecd4772cf4301171c6ff9..0a7aa08e40deba922de8896e0a0a13b1f330d6a5 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 3ae110aa85185a2f1c28ab53145da4a9f835458e..044b8ec765be05770bb6ffaa0b953c94067b5cc5 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 ba48ef50dccc779073b509be2e76c141fcd4c9dd..c5d030a77e882e205025a9ed5c44f6688f14d157 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 91f00ff187cb6af73d3ccd3442cf5da5f37ea1b7..39e56a109dbc857c8fd131bc0310b4f82421dedc 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 a567e3ac4f6b83e750289a9bb7e05a3c1a49bf4d..7e6fd0b55d3e1de16eb2430203d544a720c1daa4 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 be3170fe132b50957fdca6de198b75d136eb145d..4a6ca4f938b1284b2f59c8845c23d91e8948505a 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 8020f1388223300fd06f20ed67c669137643a2d0..807ca35db612f1bbdbd069b07574d06efa6e11b7 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 829e078c69ff69aed9797ec5db95d43987188704..9332f04a13b2213d4d8b96495d4c9a452c2f0d14 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 65a223b7ba51332d48994cb503aa503ae5d4e05b..eb27c36403b75a9f9fb4ef68f03dcfd41248d5e8 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);