From 9c1728464589f918a6354514569afe15e98e1cde Mon Sep 17 00:00:00 2001
From: "Constantin P." <papizh.konstantin@demlabs.net>
Date: Wed, 2 Oct 2024 23:17:17 +0700
Subject: [PATCH] ...

---
 net/stream/ch/dap_stream_ch_gossip.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/net/stream/ch/dap_stream_ch_gossip.c b/net/stream/ch/dap_stream_ch_gossip.c
index 2d5920f9f..8421b49e0 100644
--- a/net/stream/ch/dap_stream_ch_gossip.c
+++ b/net/stream/ch/dap_stream_ch_gossip.c
@@ -239,7 +239,7 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
         debug_if(s_debug_more, L_INFO, "IN: GOSSIP_DATA packet for hash %s", dap_hash_fast_to_str_static(&l_msg->payload_hash));
         unsigned l_hash_value = 0;
         HASH_VALUE(&l_msg->payload_hash, sizeof(dap_hash_t), l_hash_value);
-        struct gossip_msg_item *l_payload_item = NULL;
+        struct gossip_msg_item *l_payload_item = NULL, *l_payload_item_new;
         pthread_rwlock_wrlock(&s_gossip_lock);
         HASH_FIND_BYHASHVALUE(hh, s_gossip_last_msgs, &l_msg->payload_hash, sizeof(dap_hash_t), l_hash_value, l_payload_item);
         if (!l_payload_item || l_payload_item->with_payload) {
@@ -278,14 +278,16 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
             pthread_rwlock_unlock(&s_gossip_lock);
             break;
         }
-        HASH_DEL(s_gossip_last_msgs, l_payload_item);
         size_t l_payload_item_size = dap_gossip_msg_get_size(l_msg) + sizeof(g_node_addr) + sizeof(struct gossip_msg_item);
-        l_payload_item = DAP_REALLOC(l_payload_item, l_payload_item_size);
-        if (!l_payload_item) {
+        l_payload_item_new = DAP_REALLOC(l_payload_item, l_payload_item_size);
+        if (!l_payload_item_new) {
             log_it(L_CRITICAL, "%s", c_error_memory_alloc);
             pthread_rwlock_unlock(&s_gossip_lock);
             break;
         }
+        HASH_DEL(s_gossip_last_msgs, l_payload_item);
+        l_payload_item = l_payload_item_new;
+        HASH_ADD_BYHASHVALUE(hh, s_gossip_last_msgs, payload_hash, sizeof(dap_hash_t), l_hash_value, l_payload_item);
         l_payload_item->with_payload = true;
         // Copy message and append g_node_addr to pathtrace
         dap_gossip_msg_t *l_msg_new = (dap_gossip_msg_t *)l_payload_item->message;
@@ -293,7 +295,6 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t *a_ch, void *a_arg)
         l_msg_new->trace_len = l_msg->trace_len + sizeof(g_node_addr);
         *(dap_stream_node_addr_t *)(l_msg_new->trace_n_payload + l_msg->trace_len) = g_node_addr;
         memcpy(l_msg_new->trace_n_payload + l_msg_new->trace_len, l_msg->trace_n_payload + l_msg->trace_len, l_msg->payload_len);
-        HASH_ADD_BYHASHVALUE(hh, s_gossip_last_msgs, payload_hash, sizeof(dap_hash_t), l_hash_value, l_payload_item);
         // Broadcast new message
         debug_if(s_debug_more, L_INFO, "OUT: GOSSIP_HASH broadcast for hash %s",
                                         dap_hash_fast_to_str_static(&l_msg_new->payload_hash));
-- 
GitLab