diff --git a/dap-sdk/crypto/src/dap_cert.c b/dap-sdk/crypto/src/dap_cert.c index 8e77a4649d4d2e773c569adc4e32168d8cb2a6a1..661d59f77ce8fb5ec3b5f13315f0d2f5e4608aac 100755 --- a/dap-sdk/crypto/src/dap_cert.c +++ b/dap-sdk/crypto/src/dap_cert.c @@ -289,6 +289,7 @@ void dap_cert_delete_by_name(const char * a_cert_name) */ dap_cert_t * dap_cert_find_by_name(const char * a_cert_name) { + if (!a_cert_name) return NULL; dap_cert_item_t * l_cert_item = NULL; HASH_FIND_STR(s_certs,a_cert_name,l_cert_item); if ( l_cert_item ){ diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 270a3de6e267f6eb55b0f1d26e384e452be2e3b0..16322cf602eb8164ec796bfb0d39a22f396d5a6f 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -336,7 +336,7 @@ static void s_sync_out_gdb_first_worker_callback(dap_worker_t *a_worker, void *a dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain->request_hdr.net_id); // Add it to outgoing list - l_ch_chain->request_db_log = l_sync_request->gdb.db_log; + if (l_ch_chain->request_db_log == NULL) l_ch_chain->request_db_log = l_sync_request->gdb.db_log; l_ch_chain->state = CHAIN_STATE_SYNC_GLOBAL_DB; dap_chain_node_addr_t l_node_addr = { 0 }; l_node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); @@ -394,12 +394,24 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar { struct sync_request *l_sync_request = (struct sync_request *)a_arg; dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id); + dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_sync_request->worker), l_sync_request->ch_uuid); + if (l_ch == NULL) { + log_it(L_INFO, "Client disconnected before we sent the reply"); + s_sync_request_delete(l_sync_request); + return; + } + dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch); + int l_flags = 0; if (dap_chain_net_get_add_gdb_group(l_net, l_sync_request->request.node_addr)) l_flags |= F_DB_LOG_ADD_EXTRA_GROUPS; if (!l_sync_request->request.id_start) l_flags |= F_DB_LOG_SYNC_FROM_ZERO; - dap_db_log_list_t *l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + dap_db_log_list_t *l_db_log = NULL; + if (l_ch_chain->request_db_log == NULL) { + l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + l_ch_chain->request_db_log = l_db_log; + } if(l_db_log) { if (s_debug_more) @@ -445,8 +457,11 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a l_flags |= F_DB_LOG_ADD_EXTRA_GROUPS; if (!l_sync_request->request.id_start) l_flags |= F_DB_LOG_SYNC_FROM_ZERO; - dap_db_log_list_t *l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); - l_ch_chain->request_db_log = l_db_log; + dap_db_log_list_t *l_db_log = NULL; + if (l_ch_chain->request_db_log == NULL) { + l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + l_ch_chain->request_db_log = l_db_log; + } l_ch_chain->state = CHAIN_STATE_UPDATE_GLOBAL_DB; l_sync_request->request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_sync_update_gdb_start_worker_callback, l_sync_request); @@ -799,7 +814,8 @@ static bool s_chain_timer_callback(void *a_arg) if (!l_ch_chain->was_active) { if (l_ch_chain->state != CHAIN_STATE_IDLE) { dap_stream_ch_chain_go_idle(l_ch_chain); - } + } + if (l_ch_chain->request_db_log) s_free_log_list_gdb(l_ch_chain); DAP_DELETE(a_arg); l_ch_chain->activity_timer = NULL; return false; @@ -1405,6 +1421,29 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } +/** + * @brief dap_stream_ch_chain_go_idle_and_free_log_list + * @param a_ch_chain + */ +void s_free_log_list_gdb ( dap_stream_ch_chain_t * a_ch_chain) +{ + // free log list + dap_db_log_list_delete(a_ch_chain->request_db_log); + a_ch_chain->request_db_log = NULL; + dap_stream_ch_chain_hash_item_t *l_hash_item = NULL, *l_tmp = NULL; + HASH_ITER(hh, a_ch_chain->remote_gdbs, l_hash_item, l_tmp) { + HASH_DEL(a_ch_chain->remote_gdbs, l_hash_item); + DAP_DELETE(l_hash_item); + } +#if 0 + HASH_ITER(hh, a_ch_chain->remote_atoms, l_hash_item, l_tmp) { + HASH_DEL(a_ch_chain->remote_atoms, l_hash_item); + DAP_DELETE(l_hash_item); + } + a_ch_chain->remote_atoms = a_ch_chain->remote_gdbs = NULL; +#endif + a_ch_chain->remote_gdbs = NULL; +} /** * @brief dap_stream_ch_chain_go_idle * @param a_ch_chain @@ -1423,19 +1462,14 @@ void dap_stream_ch_chain_go_idle ( dap_stream_ch_chain_t * a_ch_chain) a_ch_chain->request_atom_iter->chain->callback_atom_iter_delete(a_ch_chain->request_atom_iter); a_ch_chain->request_atom_iter = NULL; } - // free log list - dap_db_log_list_delete(a_ch_chain->request_db_log); - a_ch_chain->request_db_log = NULL; + dap_stream_ch_chain_hash_item_t *l_hash_item = NULL, *l_tmp = NULL; - HASH_ITER(hh, a_ch_chain->remote_gdbs, l_hash_item, l_tmp) { - HASH_DEL(a_ch_chain->remote_gdbs, l_hash_item); - DAP_DELETE(l_hash_item); - } + HASH_ITER(hh, a_ch_chain->remote_atoms, l_hash_item, l_tmp) { HASH_DEL(a_ch_chain->remote_atoms, l_hash_item); DAP_DELETE(l_hash_item); } - a_ch_chain->remote_atoms = a_ch_chain->remote_gdbs = NULL; + a_ch_chain->remote_atoms = NULL; } /**