diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index d6091478ba25be59df4949d9d7ffa48079be004e..9d73093321f8b4f7b8fb907a4d211caf5310ade9 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -714,19 +714,12 @@ ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_ato dap_cluster_t *l_net_cluster = dap_cluster_find(l_chain->net_id.uint64); if (l_net_cluster) { size_t l_pkt_size = a_atom_size + sizeof(dap_chain_ch_pkt_t); - dap_chain_ch_pkt_t *l_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_pkt_size); + dap_chain_ch_pkt_t *l_pkt = dap_chain_ch_pkt_new(l_chain->net_id.uint64, l_chain->id.uint64, + a_chain_cell->id.uint64, a_atom, a_atom_size); if (l_pkt) { - l_pkt->hdr.version = 2; - l_pkt->hdr.data_size = a_atom_size; - l_pkt->hdr.net_id = l_chain->net_id; - l_pkt->hdr.chain_id = l_chain->id; - l_pkt->hdr.cell_id = a_chain_cell->id; - memcpy(l_pkt->data, a_atom, a_atom_size); - dap_gossip_msg_issue(l_net_cluster, DAP_STREAM_CH_CHAIN_ID, - l_pkt, l_pkt_size, a_new_atom_hash); + dap_gossip_msg_issue(l_net_cluster, DAP_STREAM_CH_CHAIN_ID, l_pkt, l_pkt_size, a_new_atom_hash); DAP_DELETE(l_pkt); - } else - log_it(L_CRITICAL, "Not enough memory"); + } } } ssize_t l_res = dap_chain_cell_file_append(a_chain_cell, a_atom, a_atom_size); diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c index 45868c8b5ba6604d57223d0537cd3324165fd20e..3bc47068d03e0e8e3fe6a266344a62c5cee80edf 100644 --- a/modules/chain/dap_chain_ch.c +++ b/modules/chain/dap_chain_ch.c @@ -1069,7 +1069,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN: { dap_chain_ch_pkt_t *l_chain_pkt = (dap_chain_ch_pkt_t *)l_ch_pkt->data; if (l_chain_pkt_data_size <= sizeof(dap_chain_ch_pkt_t) || - l_chain_pkt_data_size != sizeof(dap_chain_ch_pkt_t) + l_chain_pkt->hdr.data_size) { + (l_chain_pkt->hdr.version >= 2 && + l_chain_pkt_data_size != sizeof(dap_chain_ch_pkt_t) + l_chain_pkt->hdr.data_size)) { log_it(L_WARNING, "Incorrect chain packet size"); break; } diff --git a/modules/chain/dap_chain_ch_pkt.c b/modules/chain/dap_chain_ch_pkt.c index 216b31e3bc634dfdbb2799632fa166ecb5965bb9..a42b35d439b48274ce5bd1b25b80daade9d13c4d 100644 --- a/modules/chain/dap_chain_ch_pkt.c +++ b/modules/chain/dap_chain_ch_pkt.c @@ -34,21 +34,30 @@ size_t dap_chain_ch_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint uint64_t a_chain_id, uint64_t a_cell_id, const void * a_data, size_t a_data_size) { - size_t l_chain_pkt_size = sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size; - dap_chain_ch_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size); - *l_chain_pkt = (dap_chain_ch_pkt_t){ - .hdr = { .version = DAP_STREAM_CH_CHAIN_PKT_VERSION, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id } - }; - - if (a_data_size && a_data) - memcpy(l_chain_pkt->data, a_data, a_data_size); - - size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_chain_pkt, l_chain_pkt_size); + dap_chain_ch_pkt_t *l_chain_pkt = dap_chain_ch_pkt_new(a_net_id, a_chain_id, a_cell_id, a_data, a_data_size); + size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_chain_pkt, sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size); DAP_DELETE(l_chain_pkt); return l_ret; } - +dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(uint64_t a_net_id, uint64_t a_chain_id, uint64_t a_cell_id, + const void *a_data, size_t a_data_size) +{ + size_t l_chain_pkt_size = sizeof(dap_chain_ch_pkt_hdr_t) + a_data_size; + dap_chain_ch_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_chain_ch_pkt_t, l_chain_pkt_size); + if (l_chain_pkt) { + *l_chain_pkt = (dap_chain_ch_pkt_t) { + .hdr = { .version = DAP_STREAM_CH_CHAIN_PKT_VERSION, + .data_size = a_data_size, + .net_id.uint64 = a_net_id, + .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id } + }; + if (a_data_size && a_data) + memcpy(l_chain_pkt->data, a_data, a_data_size); + } else + log_it(L_CRITICAL, g_error_memory_alloc); + return l_chain_pkt; +} /** * @brief dap_chain_ch_pkt_write_mt * @param a_worker diff --git a/modules/chain/include/dap_chain_ch_pkt.h b/modules/chain/include/dap_chain_ch_pkt.h index d0f33de8cebd55eb09732936dedee1362a5814fb..90e128fb3dddddc8bf43e5346a21c7a16f494dad 100644 --- a/modules/chain/include/dap_chain_ch_pkt.h +++ b/modules/chain/include/dap_chain_ch_pkt.h @@ -36,7 +36,7 @@ #include "dap_stream_ch.h" -#define DAP_STREAM_CH_CHAIN_PKT_VERSION 0x01 +#define DAP_STREAM_CH_CHAIN_PKT_VERSION 0x02 #define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ 0x05 #define DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START 0x25 @@ -118,6 +118,9 @@ static const char* c_dap_chain_ch_pkt_type_str[]={ }; +dap_chain_ch_pkt_t *dap_chain_ch_pkt_new(uint64_t a_net_id, uint64_t a_chain_id, uint64_t a_cell_id, + const void *a_data, size_t a_data_size); + size_t dap_chain_ch_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_type, uint64_t a_net_id, uint64_t a_chain_id, uint64_t a_cell_id, const void * a_data, size_t a_data_size);