diff --git a/CMakeLists.txt b/CMakeLists.txt index e5cb36da56ee7608c80c8fd65719b284d0725fcf..81f707bea95be8b29830ae3cce3b3780767ed916 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -2,7 +2,7 @@ project(cellframe-sdk C) cmake_minimum_required(VERSION 2.8) set(CMAKE_C_STANDARD 11) -set(CELLFRAME_SDK_NATIVE_VERSION "2.6-60") +set(CELLFRAME_SDK_NATIVE_VERSION "2.6-61") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c index 48fb9ad870f5436fdab9d069b8eb4dc9fba39c08..77f47f987301ec0bd3638b64f460abccd700eab1 100644 --- a/dap-sdk/net/client/dap_client_pvt.c +++ b/dap-sdk/net/client/dap_client_pvt.c @@ -721,47 +721,52 @@ static void s_request_error(int a_err_code, void * a_obj) */ static void s_request_response(void * a_response, size_t a_response_size, void * a_obj) { - dap_client_pvt_t * a_client_internal = (dap_client_pvt_t *) a_obj; - if(!a_client_internal || !a_client_internal->client){ - if( !a_client_internal ) + dap_client_pvt_t * l_client_pvt = (dap_client_pvt_t *) a_obj; + if (! l_client_pvt || !dap_client_pvt_check(l_client_pvt) ){ + // Response received after client_pvt was deleted + return; + } + + if(!l_client_pvt || !l_client_pvt->client){ + if( !l_client_pvt ) log_it(L_ERROR,"Client internal is NULL for s_request_response"); else log_it(L_ERROR,"Client is NULL for s_request_response"); return; } - a_client_internal->refs_count--; + l_client_pvt->refs_count--; - if (a_client_internal->is_to_delete){ - if(a_client_internal->refs_count==0) // Was requested to delete until we was working with request - dap_client_delete_unsafe(a_client_internal->client); // Init delete + if (l_client_pvt->is_to_delete){ + if(l_client_pvt->refs_count==0) // Was requested to delete until we was working with request + dap_client_delete_unsafe(l_client_pvt->client); // Init delete return; } //int l_ref = dap_client_pvt_get_ref(a_client_internal); - if(a_client_internal->is_encrypted) { + if(l_client_pvt->is_encrypted) { size_t l_response_dec_size_max = a_response_size ? a_response_size * 2 + 16 : 0; char * l_response_dec = a_response_size ? DAP_NEW_Z_SIZE(char, l_response_dec_size_max) : NULL; size_t l_response_dec_size = 0; if(a_response_size) - l_response_dec_size = dap_enc_decode(a_client_internal->session_key, + l_response_dec_size = dap_enc_decode(l_client_pvt->session_key, a_response, a_response_size, l_response_dec, l_response_dec_size_max, DAP_ENC_DATA_TYPE_RAW); - if ( a_client_internal->request_response_callback ) - a_client_internal->request_response_callback(a_client_internal->client, l_response_dec, l_response_dec_size); + if ( l_client_pvt->request_response_callback ) + l_client_pvt->request_response_callback(l_client_pvt->client, l_response_dec, l_response_dec_size); else - log_it(L_ERROR, "NULL request_response_callback for encrypted client %p", a_client_internal->client ); + log_it(L_ERROR, "NULL request_response_callback for encrypted client %p", l_client_pvt->client ); if(l_response_dec) DAP_DELETE(l_response_dec); } else { - if ( a_client_internal->request_response_callback ) - a_client_internal->request_response_callback(a_client_internal->client, a_response, a_response_size); + if ( l_client_pvt->request_response_callback ) + l_client_pvt->request_response_callback(l_client_pvt->client, a_response, a_response_size); else - log_it(L_ERROR, "NULL request_response_callback for unencrypted client %p", a_client_internal->client ); + log_it(L_ERROR, "NULL request_response_callback for unencrypted client %p", l_client_pvt->client ); } //int l_ref2 = dap_client_pvt_get_ref(a_client_internal); @@ -885,6 +890,10 @@ static void s_enc_init_response(dap_client_t * a_client, void * a_response, size static void s_enc_init_error(dap_client_t * a_client, int a_err_code) { dap_client_pvt_t * l_client_pvt = DAP_CLIENT_PVT(a_client); + if (! l_client_pvt || !dap_client_pvt_check(l_client_pvt) ){ + // Response received after client_pvt was deleted + return; + } //dap_client_internal_t * l_client_internal = dap_CLIENT_INTERNAL(a_client); log_it(L_ERROR, "ENC: Can't init ecnryption session, err code %d", a_err_code); @@ -996,6 +1005,10 @@ static void s_stream_ctl_error(dap_client_t * a_client, int a_error) log_it(L_WARNING, "STREAM_CTL error %d", a_error); dap_client_pvt_t * l_client_pvt = DAP_CLIENT_PVT(a_client); + if (! l_client_pvt || !dap_client_pvt_check(l_client_pvt) ){ + // Response received after client_pvt was deleted + return; + } if (a_error == ETIMEDOUT) { l_client_pvt->last_error = ERROR_NETWORK_CONNECTION_TIMEOUT; diff --git a/dap-sdk/net/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c index 95d8146c391654eb92ec3edbdd1ee20be511483a..e259e889803c16cc89031ae46411717b55c18131 100644 --- a/dap-sdk/net/core/dap_timerfd.c +++ b/dap-sdk/net/core/dap_timerfd.c @@ -195,7 +195,7 @@ static void s_es_callback_timer(struct dap_events_socket *a_event_sock) #if defined DAP_OS_WINDOWS CloseHandle(l_timerfd->th); #endif - dap_events_socket_remove_and_delete_unsafe(l_timerfd->events_socket, false); + l_timerfd->events_socket->flags |= DAP_SOCK_SIGNAL_CLOSE; } } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 558b7216f6d92df388d6493498607f6485173500..2bcb8c44e484dc147e353bf4c3a2f28d20ef8380 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -604,8 +604,12 @@ static int s_net_states_proc(dap_chain_net_t *a_net) DL_FOREACH (a_net->pub.chains, l_chain) { dap_chain_node_client_reset(l_node_client); dap_stream_ch_chain_sync_request_t l_request = {0}; + + // TODO: Uncomment next block when finish with partial updates + /* if (! (l_pvt_net->flags & F_DAP_CHAIN_NET_SYNC_FROM_ZERO) ) dap_chain_get_atom_last_hash(l_chain,&l_request.hash_from); + */ if ( !dap_hash_fast_is_blank(&l_request.hash_from) ){ if(dap_log_level_get() <= L_DEBUG){