From 9f4160ac18c60128ca4c1fd95d234fb5729c9dd2 Mon Sep 17 00:00:00 2001 From: Dmitriy Gerasimov <naeper@demlabs.net> Date: Thu, 22 Jul 2021 15:43:27 +0700 Subject: [PATCH] [*] More leak fixes --- CMakeLists.txt | 2 +- modules/chain/dap_chain_ledger.c | 17 ++++++++---- modules/global-db/dap_chain_global_db_hist.c | 2 +- modules/mempool/dap_chain_mempool.c | 15 ++++++----- modules/net/dap_chain_net.c | 10 +++++-- modules/net/dap_chain_node_cli_cmd.c | 14 +++++----- modules/net/dap_chain_node_cli_cmd_tx.c | 9 ++++--- modules/net/dap_chain_node_ping.c | 27 +++++++++++-------- modules/net/srv/dap_chain_net_srv_order.c | 3 ++- .../service/stake/dap_chain_net_srv_stake.c | 4 +++ modules/type/blocks/dap_chain_block_chunk.c | 4 ++- 11 files changed, 67 insertions(+), 40 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 09f8b9f095..539b47b63b 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-11") +set(CELLFRAME_SDK_NATIVE_VERSION "2.9-12") add_definitions ("-DCELLFRAME_SDK_VERSION=\"${CELLFRAME_SDK_NATIVE_VERSION}\"") set(DAPSDK_MODULES "") message("Cellframe modules: ${CELLFRAME_MODULES}") diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 5ee410e7b7..6606f689db 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -684,6 +684,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite if(s_debug_more) log_it(L_ERROR,"Wrong address checksum in TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD (code %d)", l_add_addr_check); + DAP_DELETE(l_addrs); return -12; } // Check if its already present @@ -694,6 +695,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD has address %s thats already present in list", l_addr_str); DAP_DELETE(l_addr_str); + DAP_DELETE(l_addrs); return -11; } } @@ -769,6 +771,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite if(s_debug_more) log_it(L_ERROR,"Wrong address checksum in TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD (code %d)", l_add_addr_check); + DAP_DELETE(l_addrs); return -12; } // Check if its already present @@ -779,6 +782,7 @@ static int s_token_tsd_parse(dap_ledger_t * a_ledger, dap_chain_ledger_token_ite log_it(L_ERROR,"TSD param DAP_CHAIN_DATUM_TOKEN_TSD_TYPE_TX_SENDER_ALLOWED_ADD has address %s thats already present in list", l_addr_str); DAP_DELETE(l_addr_str); + DAP_DELETE(l_addrs); return -11; } } @@ -1624,11 +1628,12 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t dap_chain_hash_fast_t *l_hash_prev = dap_chain_node_datum_tx_calc_hash(l_tx_prev); int l_res_hash = dap_hash_fast_compare(l_hash_prev, &l_tx_prev_hash); + DAP_DELETE(l_hash_prev); if(l_res_sign != 1 || l_res_hash != 1) { l_err_num = -7; break; } - DAP_DELETE(l_hash_prev); + uint64_t l_value; // Get list of all 'out' items from previous transaction dap_list_t *l_list_prev_out = dap_chain_datum_tx_items_get(l_tx_prev, TX_ITEM_TYPE_OUT_ALL, NULL); @@ -1800,7 +1805,8 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t l_multichannel = true; } else { l_value_cur = DAP_NEW_Z(dap_chain_ledger_tokenizer_t); - strcpy(l_value_cur->token_ticker, l_token); + if(l_token) + strcpy(l_value_cur->token_ticker, l_token); HASH_ADD_STR(l_values_from_cur_tx, token_ticker, l_value_cur); } dap_list_t *l_list_tx_out = NULL; @@ -1860,7 +1866,8 @@ int dap_chain_ledger_tx_cache_check(dap_ledger_t *a_ledger, dap_chain_datum_tx_t // Get permissions for token l_token_item = NULL; pthread_rwlock_rdlock(&l_ledger_priv->tokens_rwlock); - HASH_FIND_STR(l_ledger_priv->tokens,l_token, l_token_item); + if(l_ledger_priv->tokens) + HASH_FIND_STR(l_ledger_priv->tokens,l_token, l_token_item); pthread_rwlock_unlock(&l_ledger_priv->tokens_rwlock); if (! l_token_item){ if(s_debug_more) @@ -2788,8 +2795,8 @@ dap_chain_datum_tx_t* dap_chain_ledger_tx_cache_find_out_cond(dap_ledger_t *a_le dap_chain_datum_tx_t *l_cur_tx = NULL; bool is_null_hash = dap_hash_fast_is_blank(a_tx_first_hash); bool is_search_enable = is_null_hash; - dap_chain_ledger_tx_item_t *l_iter_current, *l_item_tmp; - dap_chain_tx_out_cond_t *l_tx_out_cond; + dap_chain_ledger_tx_item_t *l_iter_current = NULL, *l_item_tmp = NULL; + dap_chain_tx_out_cond_t *l_tx_out_cond = NULL; int l_tx_out_cond_idx; pthread_rwlock_rdlock(&l_ledger_priv->ledger_rwlock); HASH_ITER(hh, l_ledger_priv->ledger_items, l_iter_current, l_item_tmp) diff --git a/modules/global-db/dap_chain_global_db_hist.c b/modules/global-db/dap_chain_global_db_hist.c index 2b2bb4b61e..05950ebc8c 100644 --- a/modules/global-db/dap_chain_global_db_hist.c +++ b/modules/global-db/dap_chain_global_db_hist.c @@ -978,7 +978,7 @@ char* dap_db_history(dap_chain_addr_t * a_addr, const char *a_group_mempool) dap_string_append_printf(l_str_out, "%s in send %lld %s from %s\n to %s\n", l_time_str ? l_time_str : "", - l_tx_prev_out->header.value, + l_tx_prev_out?l_tx_prev_out->header.value:0, l_tx_data->token_ticker, l_src_str ? l_src_str : "", l_dst_to_str); diff --git a/modules/mempool/dap_chain_mempool.c b/modules/mempool/dap_chain_mempool.c index e5c52a353a..9d7c383479 100644 --- a/modules/mempool/dap_chain_mempool.c +++ b/modules/mempool/dap_chain_mempool.c @@ -246,6 +246,7 @@ int dap_chain_mempool_tx_create_massive( dap_chain_t * a_chain, dap_enc_key_t *a log_it(L_ERROR,"Not enought values on output %llu to produce enought ins %llu when need %llu", l_value_to_items, l_value_transfer, l_value_need); + DAP_DELETE(l_objs); return -5; } @@ -803,7 +804,6 @@ dap_datum_mempool_t * dap_datum_mempool_deserialize(uint8_t *a_datum_mempool_ser shift_size += size_one; } assert(shift_size == a_datum_mempool_ser_size); - DAP_DELETE(a_datum_mempool_ser); return datum_mempool; } @@ -921,8 +921,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) dap_datum_mempool_t *datum_mempool = (action != DAP_DATUM_MEMPOOL_NONE) ? dap_datum_mempool_deserialize((uint8_t*) request_str, (size_t) request_size) : NULL; - if(datum_mempool) - { + if(datum_mempool){ dap_datum_mempool_free(datum_mempool); char *a_key = calc_datum_hash(request_str, (size_t) request_size); switch (action) @@ -936,7 +935,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) } log_it(L_INFO, "Insert hash: key=%s result:%s", a_key, (*return_code == Http_Status_OK) ? "OK" : "False!"); - DAP_DELETE(a_key); + DAP_DEL_Z(a_key); break; case DAP_DATUM_MEMPOOL_CHECK: // check datum in base @@ -946,7 +945,7 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) dap_config_get_item_str_default(g_config, "mempool", "gdb_group", "datum-pool")); if(str) { dg->response = strdup("1"); - DAP_DELETE(str); + DAP_DEL_Z(str); log_it(L_INFO, "Check hash: key=%s result: Present", a_key); } else @@ -985,9 +984,11 @@ void chain_mempool_proc(struct dap_http_simple *cl_st, void * arg) return; } DAP_DEL_Z(a_key); - } - else + } else{ *return_code = Http_Status_BadRequest; + } + + DAP_DELETE(request_str); } else *return_code = Http_Status_BadRequest; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 4bc508ce9f..a3789b6ab0 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -897,9 +897,15 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) struct link_dns_request * l_dns_request = DAP_NEW_Z(struct link_dns_request); l_dns_request->net = l_net; l_dns_request->link_id = l_link_id; - dap_chain_node_info_dns_request(l_addr, l_port, l_net->pub.name, l_link_node_info, + if(dap_chain_node_info_dns_request(l_addr, l_port, l_net->pub.name, l_link_node_info, s_net_state_link_prepare_success, - s_net_state_link_prepare_error,l_dns_request); + s_net_state_link_prepare_error,l_dns_request) != 0 ){ + log_it(L_ERROR, "Can't process node info dns request"); + DAP_DEL_Z(l_link_node_info); + + } + }else{ + DAP_DEL_Z(l_link_node_info); } } l_link_id++; diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 98e181d30e..54a107fe19 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -121,11 +121,8 @@ dap_chain_node_addr_t* dap_chain_node_addr_get_by_alias(dap_chain_net_t * a_net, l_addr = (dap_chain_node_addr_t*) (void*) dap_chain_global_db_gr_get(a_key, &l_addr_size, a_net->pub.gdb_nodes_aliases); if(l_addr_size != sizeof(dap_chain_node_addr_t)) { -// l_addr = DAP_NEW_Z(dap_chain_node_addr_t); -// if(hex2bin((char*) l_addr, (const unsigned char *) addr_str, sizeof(dap_chain_node_addr_t) * 2) == -1) { DAP_DELETE(l_addr); -// l_addr = NULL; -// } + l_addr = NULL; } // DAP_DELETE(addr_str); return l_addr; @@ -879,6 +876,7 @@ int com_node(int a_argc, char ** a_argv, void *arg_func, char **a_str_reply) case CMD_ADD: if(!arg_index || a_argc < 8) { dap_chain_node_cli_set_reply_text(a_str_reply, "invalid parameters"); + DAP_DELETE(l_node_info); return -1; } // handler of command 'node add' @@ -1849,7 +1847,7 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re const char * l_certs_str = NULL; dap_cert_t ** l_certs = NULL; size_t l_certs_count = 0; - dap_chain_t * l_chain; + dap_chain_t * l_chain = NULL; dap_chain_net_t * l_net = NULL; dap_chain_node_cli_cmd_values_parse_net_chain(&arg_index, argc, argv, a_str_reply, &l_chain, &l_net); @@ -3102,7 +3100,7 @@ int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r char * l_emission_hash_str_new = NULL; dap_chain_hash_fast_t l_emission_hash={0}; dap_chain_datum_token_emission_t * l_emission = NULL; - char * l_emission_hash_str_base58; + char * l_emission_hash_str_base58 = NULL; const char * l_certs_str = NULL; @@ -3302,6 +3300,7 @@ int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r else dap_chain_node_cli_set_reply_text(a_str_reply, "datum emission %s is not placed in datum pool ", l_emission_hash_str_base58); DAP_DEL_Z(l_emission_hash_str_new); + l_emission_hash_str = NULL; DAP_DEL_Z(l_emission_hash_str_base58); DAP_DEL_Z(l_datum_emission); return -1; @@ -3344,6 +3343,7 @@ int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r DAP_DEL_Z(l_out); DAP_DEL_Z(l_emission_hash_str_new); + l_emission_hash_str = NULL; DAP_DEL_Z(l_emission_hash_str_base58); size_t l_tx_size = dap_chain_datum_tx_get_size(l_tx); @@ -3725,7 +3725,7 @@ int com_tx_create(int argc, char ** argv, void *arg_func, char **str_reply) } dap_chain_net_t * l_net = dap_chain_net_by_name(l_net_name); dap_ledger_t *l_ledger = l_net ? l_net->pub.ledger : NULL; - if((l_ledger = dap_chain_ledger_by_net_name(l_net_name)) == NULL) { + if(l_net == NULL || (l_ledger = dap_chain_ledger_by_net_name(l_net_name)) == NULL) { dap_chain_node_cli_set_reply_text(str_reply, "not found net by name '%s'", l_net_name); return -1; } diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 3885d764a1..6bf330abc8 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -712,7 +712,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons dap_list_t *l_list_out_info_tmp = l_list_out_info; while(l_list_out_info_tmp) { l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data; - if(l_tx_data->token_ticker[0]) + if(l_tx_data->token_ticker && l_tx_data->token_ticker[0]) break; l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); } @@ -759,7 +759,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons dap_list_t *l_list_out_info_tmp = l_list_out_info; while(l_list_out_info_tmp) { l_tx_data = (dap_tx_data_t*) l_list_out_info_tmp->data; - if(l_tx_data->token_ticker[0]) + if(l_tx_data->token_ticker && l_tx_data->token_ticker[0]) break; l_list_out_info_tmp = dap_list_next(l_list_out_info_tmp); } @@ -870,7 +870,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_records_tmp->data; - if(l_tx_data->is_use_all_cur_out + if(( l_tx_data && l_tx_data->is_use_all_cur_out ) || !memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))) { char *l_addr_str = (l_tx_out) ? dap_chain_addr_to_str(&l_tx_out->addr) : NULL; @@ -880,7 +880,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons tx_hash_str = dap_strdup(l_tx_data->tx_hash_str); else tx_hash_str = dap_enc_base58_from_hex_str_to_str(l_tx_data->tx_hash_str); - if(!memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))) { + if(l_tx_out && a_addr && memcmp(&l_tx_out->addr, a_addr, sizeof(dap_chain_addr_t))==0) { if(!l_src_str_is_cur) dap_string_append_printf(l_str_out, "tx hash %s \n %s recv %lu %s from %s\n", @@ -1674,6 +1674,7 @@ int com_ledger(int a_argc, char ** a_argv, void *a_arg_func, char **a_str_reply) dap_chain_enum_unlock(); l_chain_cur = dap_chain_enum(&l_chain_tmp); } + DAP_DELETE(l_addr); _dap_chain_tx_hash_processed_ht_free(l_list_tx_hash_processd); // all chain if(!l_chain) diff --git a/modules/net/dap_chain_node_ping.c b/modules/net/dap_chain_node_ping.c index bfd102f425..93ea2bb5cf 100644 --- a/modules/net/dap_chain_node_ping.c +++ b/modules/net/dap_chain_node_ping.c @@ -90,8 +90,10 @@ static void* node_ping_proc(void *a_arg) char *host4 = DAP_NEW_SIZE(char, INET_ADDRSTRLEN); struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = l_addr }; const char* str_ip4 = inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host4, INET_ADDRSTRLEN); - if(!str_ip4) + if(!str_ip4){ + DAP_DELETE(host4); return NULL ; + } //printf(" %s %d ping start\n", str_ip4, l_count); /* // send ping @@ -202,7 +204,7 @@ static void* node_ping_background_proc(void *a_arg) uint64_t *l_nodes_addr = DAP_NEW_Z_SIZE(uint64_t, sizeof(uint64_t) * l_nodes_count); dap_list_t *l_node_list0 = l_node_list; - dap_chain_node_addr_t *s_node_addr_tr = NULL, *l_node_addr_ping = NULL; + dap_chain_node_addr_t *l_node_addr_tr2 = NULL, *l_node_addr_ping = NULL; int l_min_hops = INT32_MAX; int l_min_ping = INT32_MAX; // send ping to all nodes @@ -214,15 +216,17 @@ static void* node_ping_background_proc(void *a_arg) char *host4 = DAP_NEW_SIZE(char, INET_ADDRSTRLEN); struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = l_node_info->hdr.ext_addr_v4 }; const char* str_ip4 = inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host4, INET_ADDRSTRLEN); - if(!str_ip4) + if(!str_ip4){ + DAP_DELETE(host4); continue; + } int hops = 0, time_usec = 0; #ifdef DAP_OS_LINUX int res = traceroute_util(str_ip4, &hops, &time_usec); #endif DAP_DELETE(host4); if(l_min_hops>hops) - s_node_addr_tr = l_node_list->data; + l_node_addr_tr2 = l_node_list->data; // start sending ping start_node_ping(&l_threads[l_thread_id], l_node_info->hdr.ext_addr_v4, l_node_info->hdr.ext_port, 1); @@ -258,13 +262,14 @@ static void* node_ping_background_proc(void *a_arg) } // allocate memory for best node addresses - dap_chain_node_addr_t *s_node_addr_tmp; - s_node_addr_tmp = DAP_NEW(dap_chain_node_addr_t); - memcpy(s_node_addr_tmp, s_node_addr_tr, sizeof(dap_chain_node_addr_t)); - s_node_addr_tr = s_node_addr_tmp; - s_node_addr_tmp = DAP_NEW(dap_chain_node_addr_t); - memcpy(s_node_addr_tmp, s_node_addr_ping, sizeof(dap_chain_node_addr_t)); - s_node_addr_ping = s_node_addr_tmp; + dap_chain_node_addr_t *l_node_addr_tmp; + l_node_addr_tmp = DAP_NEW(dap_chain_node_addr_t); + memcpy(l_node_addr_tmp, l_node_addr_tr2, sizeof(dap_chain_node_addr_t)); + DAP_DELETE(l_node_addr_tr2); + l_node_addr_tr2 = l_node_addr_tmp; + l_node_addr_tmp = DAP_NEW(dap_chain_node_addr_t); + memcpy(l_node_addr_tmp, s_node_addr_ping, sizeof(dap_chain_node_addr_t)); + s_node_addr_ping = l_node_addr_tmp; // delete memory DAP_DELETE(l_nodes_addr); diff --git a/modules/net/srv/dap_chain_net_srv_order.c b/modules/net/srv/dap_chain_net_srv_order.c index a61fa752ff..48f7fafa6d 100644 --- a/modules/net/srv/dap_chain_net_srv_order.c +++ b/modules/net/srv/dap_chain_net_srv_order.c @@ -417,7 +417,8 @@ lb_order_pass: if (l_order_pass_first) { l_order_pass_first = false; *a_output_orders_count = l_order_passed_index; - *a_output_orders = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_orders_size); + if(l_orders_size) + *a_output_orders = DAP_NEW_Z_SIZE(dap_chain_net_srv_order_t, l_orders_size); goto lb_order_pass; } // If we here - its the second pass through diff --git a/modules/service/stake/dap_chain_net_srv_stake.c b/modules/service/stake/dap_chain_net_srv_stake.c index 038d925dec..b5cd774ea8 100644 --- a/modules/service/stake/dap_chain_net_srv_stake.c +++ b/modules/service/stake/dap_chain_net_srv_stake.c @@ -567,6 +567,7 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha if (l_token_str) { if (!dap_chain_ledger_token_ticker_check(l_net->pub.ledger, l_token_str)) { dap_chain_node_cli_set_reply_text(a_str_reply, "Token ticker %s not found", l_token_str); + DAP_DELETE(l_stake); return -6; } strcpy(l_stake->token, l_token_str); @@ -576,6 +577,7 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha uint64_t l_value = strtoull(l_coins_str, NULL, 10); if (!l_value) { dap_chain_node_cli_set_reply_text(a_str_reply, "Format -coins <unsigned long long>"); + DAP_DELETE(l_stake); return -8; } l_stake->value = l_value; @@ -585,11 +587,13 @@ static int s_cli_srv_stake_order(int a_argc, char **a_argv, int a_arg_index, cha long double l_fee = strtold(l_fee_str, NULL); if (!l_fee) { dap_chain_node_cli_set_reply_text(a_str_reply, "Format -fee_percent <long double> %"); + DAP_DELETE(l_stake); return -12; } } if (!l_token_str && !l_coins_str && !l_addr_from_str && !l_fee_str) { dap_chain_node_cli_set_reply_text(a_str_reply, "At least one of updating parameters is mandatory"); + DAP_DELETE(l_stake); return -16; } dap_chain_addr_t *l_addr_to = dap_cert_to_addr(l_cert, l_net->pub.id); diff --git a/modules/type/blocks/dap_chain_block_chunk.c b/modules/type/blocks/dap_chain_block_chunk.c index 002900357a..6f39238f6c 100644 --- a/modules/type/blocks/dap_chain_block_chunk.c +++ b/modules/type/blocks/dap_chain_block_chunk.c @@ -193,7 +193,9 @@ void dap_chain_block_chunks_sort(dap_chain_block_chunks_t * a_chunks) // Sort chunk list beginning from the new one and bubble up the longest one on the top size_t l_chunk_length_max=0; //dap_chain_block_chunk_t * l_chunk_max = NULL; - for (dap_chain_block_chunk_t * l_chunk = a_chunks->chunks_first ; l_chunk; l_chunk = l_chunk->next ){ + for (dap_chain_block_chunk_t * l_chunk = a_chunks->chunks_first ; l_chunk; l_chunk = l_chunk? l_chunk->next: NULL ){ + if(!l_chunk) + break; size_t l_chunk_length = HASH_COUNT(l_chunk->block_cache_hash); if (! l_chunk_length){ log_it(L_WARNING,"Chunk can't be empty, it must be deleted from chunks treshold"); -- GitLab