diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 567eaaf33f10e8331311834946a58f0d6f0ed47d..b0c7805546ba1dc3fbef4224fa9fa0656db21be1 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -912,12 +912,13 @@ struct sync_request *dap_stream_ch_chain_create_sync_request(dap_stream_ch_chain { dap_stream_ch_chain_t * l_ch_chain = DAP_STREAM_CH_CHAIN(a_ch); struct sync_request *l_sync_request = DAP_NEW_Z(struct sync_request); - l_sync_request->ch_uuid = a_ch->uuid; - l_sync_request->worker = a_ch->stream_worker->worker; - l_sync_request->remote_gdbs = l_ch_chain->remote_gdbs; - l_sync_request->remote_atoms = l_ch_chain->remote_atoms; - l_sync_request->request_hdr = l_ch_chain->request_hdr = a_chain_pkt->hdr; - l_sync_request->request = l_ch_chain->request; + *l_sync_request = (struct sync_request) { + .worker = a_ch->stream_worker->worker, + .ch_uuid = a_ch->uuid, + .request = l_ch_chain->request, + .request_hdr = a_chain_pkt->hdr, + .remote_atoms = l_ch_chain->remote_atoms, + .remote_gdbs = l_ch_chain->remote_gdbs }; return l_sync_request; } @@ -1074,6 +1075,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) l_ch_chain->request.id_start = 1; // incremental sync by default struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); l_ch_chain->stats_request_gdb_processed = 0; + l_ch_chain->request_hdr = l_chain_pkt->hdr; dap_proc_queue_add_callback_inter(a_ch->stream_worker->worker->proc_queue_input, s_sync_update_gdb_proc_callback, l_sync_request); } break; @@ -1409,6 +1411,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); l_ch_chain->stats_request_atoms_processed = 0; + l_ch_chain->request_hdr = l_chain_pkt->hdr; if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS) { char l_hash_from_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }, l_hash_to_str[DAP_CHAIN_HASH_FAST_STR_SIZE] = { '\0' }; dap_chain_hash_fast_t l_hash_from = l_ch_chain->request.hash_from, @@ -1449,6 +1452,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(l_chain_pkt_data_size) { dap_chain_t * l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); if(l_chain) { + l_ch_chain->request_hdr = l_chain_pkt->hdr; // Expect atom element in if(l_chain_pkt_data_size > 0) { struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); diff --git a/modules/channel/chain/dap_stream_ch_chain_pkt.c b/modules/channel/chain/dap_stream_ch_chain_pkt.c index ad3e01b90e3b0ca28d61d8a71467e0684d36911c..f939d3231f53a5c482a0475ae155a2f61ee6d4b6 100644 --- a/modules/channel/chain/dap_stream_ch_chain_pkt.c +++ b/modules/channel/chain/dap_stream_ch_chain_pkt.c @@ -54,7 +54,7 @@ size_t dap_stream_ch_chain_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_typ const void * a_data, size_t a_data_size) { size_t l_chain_pkt_size = sizeof(dap_stream_ch_chain_pkt_hdr_t) + a_data_size; - dap_stream_ch_chain_pkt_t *l_chain_pkt = DAP_NEW_STACK_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size); + dap_stream_ch_chain_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size); *l_chain_pkt = (dap_stream_ch_chain_pkt_t){ .hdr = { .version = 1, .net_id.uint64 = a_net_id, .cell_id.uint64 = a_cell_id, .chain_id.uint64 = a_chain_id } }; @@ -62,7 +62,9 @@ size_t dap_stream_ch_chain_pkt_write_unsafe(dap_stream_ch_t *a_ch, uint8_t a_typ if (a_data_size && a_data) memcpy(l_chain_pkt->data, a_data, a_data_size); - return dap_stream_ch_pkt_write_unsafe(a_ch, a_type , l_chain_pkt, l_chain_pkt_size); + size_t l_ret = dap_stream_ch_pkt_write_unsafe(a_ch, a_type, l_chain_pkt, l_chain_pkt_size); + DAP_DELETE(l_chain_pkt); + return l_ret; } @@ -82,18 +84,16 @@ size_t dap_stream_ch_chain_pkt_write_mt(dap_stream_worker_t *a_worker, dap_strea uint64_t a_chain_id, uint64_t a_cell_id, const void * a_data, size_t a_data_size) { - dap_stream_ch_chain_pkt_t * l_chain_pkt; - size_t l_chain_pkt_size = sizeof (l_chain_pkt->hdr) + a_data_size; - l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size ); - l_chain_pkt->hdr.version = 1; - l_chain_pkt->hdr.net_id.uint64 = a_net_id; - l_chain_pkt->hdr.cell_id.uint64 = a_cell_id; - l_chain_pkt->hdr.chain_id.uint64 = a_chain_id; + size_t l_chain_pkt_size = sizeof(dap_stream_ch_chain_pkt_hdr_t) + a_data_size; + dap_stream_ch_chain_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size ); + *l_chain_pkt = (dap_stream_ch_chain_pkt_t){ + .hdr = { .version = 1, .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); + memcpy(l_chain_pkt->data, a_data, a_data_size); - size_t l_ret = dap_stream_ch_pkt_write_mt(a_worker, a_ch_uuid, a_type , l_chain_pkt, l_chain_pkt_size); + size_t l_ret = dap_stream_ch_pkt_write_mt(a_worker, a_ch_uuid, a_type, l_chain_pkt, l_chain_pkt_size); DAP_DELETE(l_chain_pkt); return l_ret; } @@ -116,18 +116,16 @@ size_t dap_stream_ch_chain_pkt_write_inter(dap_events_socket_t * a_es_input, dap uint64_t a_chain_id, uint64_t a_cell_id, const void * a_data, size_t a_data_size) { - dap_stream_ch_chain_pkt_t * l_chain_pkt; - size_t l_chain_pkt_size = sizeof (l_chain_pkt->hdr) + a_data_size; - l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size ); - l_chain_pkt->hdr.version = 1; - l_chain_pkt->hdr.net_id.uint64 = a_net_id; - l_chain_pkt->hdr.cell_id.uint64 = a_cell_id; - l_chain_pkt->hdr.chain_id.uint64 = a_chain_id; + size_t l_chain_pkt_size = sizeof(dap_stream_ch_chain_pkt_hdr_t) + a_data_size; + dap_stream_ch_chain_pkt_t *l_chain_pkt = DAP_NEW_Z_SIZE(dap_stream_ch_chain_pkt_t, l_chain_pkt_size ); + *l_chain_pkt = (dap_stream_ch_chain_pkt_t){ + .hdr = { .version = 1, .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); + memcpy(l_chain_pkt->data, a_data, a_data_size); - size_t l_ret = dap_stream_ch_pkt_write_inter(a_es_input, a_ch_uuid, a_type , l_chain_pkt, l_chain_pkt_size); + size_t l_ret = dap_stream_ch_pkt_write_inter(a_es_input, a_ch_uuid, a_type, l_chain_pkt, l_chain_pkt_size); DAP_DELETE(l_chain_pkt); return l_ret; } diff --git a/modules/common/dap_chain_datum_token.c b/modules/common/dap_chain_datum_token.c index f9f9ec7ec6cd07eedf38763019929e55623d8c87..d986a74718851a66d0833e3955a63ea719afa321 100644 --- a/modules/common/dap_chain_datum_token.c +++ b/modules/common/dap_chain_datum_token.c @@ -402,6 +402,11 @@ byte_t *dap_chain_emission_get_tsd(dap_chain_datum_token_emission_t *a_emission, return NULL; dap_tsd_t *l_tsd = (dap_tsd_t *)a_emission->tsd_n_signs; do { + if (a_emission->data.type_auth.tsd_total_size < l_tsd->size) { + log_it(L_ERROR, "Corrupt data in emission: invalid TSD size %lu < %u", + a_emission->data.type_auth.tsd_total_size, l_tsd->size); + return NULL; + } if (l_tsd->type == a_type) { if (a_size) *a_size = l_tsd->size;