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