diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h index c40a3791fd59dddad6d5c92ac320d8623aa972b2..c1389199a3785207478d4d94f0faf1efa61d2ea8 100755 --- a/dap-sdk/core/include/dap_common.h +++ b/dap-sdk/core/include/dap_common.h @@ -162,6 +162,20 @@ DAP_STATIC_INLINE void _dap_aligned_free( void *ptr ) #define DAP_PROTOCOL_VERSION 22 +#if __SIZEOF_LONG__==8 +#define DAP_UINT64_FORMAT_X "lX" +#define DAP_UINT64_FORMAT_x "lx" +#define DAP_UINT64_FORMAT_u "lu" +#define DAP_UINT64_FORMAT_U "lU" +#elif __SIZEOF_LONG__==4 +#define DAP_UINT64_FORMAT_X "llX" +#define DAP_UINT64_FORMAT_x "llx" +#define DAP_UINT64_FORMAT_u "llu" +#define DAP_UINT64_FORMAT_U "llU" +#else +#error "DAP_UINT64_FORMAT_* are undefined for your platform" +#endif + #ifndef LOWORD #define LOWORD( l ) ((uint16_t) (((uintptr_t) (l)) & 0xFFFF)) #define HIWORD( l ) ((uint16_t) ((((uintptr_t) (l)) >> 16) & 0xFFFF)) diff --git a/dap-sdk/crypto/src/dap_enc_base58.c b/dap-sdk/crypto/src/dap_enc_base58.c index a8538a9b97132b8758bf6d5819c6d7d8872e01d4..acbfe8fcc550e359a81542ea00ab35564fe77636 100755 --- a/dap-sdk/crypto/src/dap_enc_base58.c +++ b/dap-sdk/crypto/src/dap_enc_base58.c @@ -27,6 +27,8 @@ #include <stdint.h> #include <string.h> #include "dap_common.h" +#include "dap_strfuncs.h" +#include "dap_string.h" #include "dap_enc_base58.h" #define LOG_TAG "dap_enc_base58" @@ -225,7 +227,7 @@ char* dap_enc_base58_from_hex_str_to_str(const char *a_in_str) return NULL; // from "0x..." to binary char *l_out_str = DAP_NEW_Z_SIZE(char, a_in_hash_len / 2 + 1); - size_t len = dap_hex2bin(l_out_str, a_in_str+2, a_in_hash_len-2); + size_t len = dap_hex2bin((uint8_t*)l_out_str, a_in_str+2, a_in_hash_len-2); // from binary to base58 char *l_base58_out = dap_enc_base58_encode_to_str(l_out_str, len/2); DAP_DELETE(l_out_str); diff --git a/dap-sdk/crypto/src/dap_enc_base64.c b/dap-sdk/crypto/src/dap_enc_base64.c index b0f1351cead5ee1bb8329ec6fd6b50dbddbfa74d..b8d0c05783fca79606da4e7d5ecc6d3f86a26626 100755 --- a/dap-sdk/crypto/src/dap_enc_base64.c +++ b/dap-sdk/crypto/src/dap_enc_base64.c @@ -288,7 +288,7 @@ char * dap_enc_strdup_from_base64(const char * a_string_base64){ if(!l_string_base64_len) return NULL; - char * l_string = DAP_NEW_Z_SIZE(byte_t, l_string_base64_len * 2); + char * l_string = DAP_NEW_Z_SIZE(char, l_string_base64_len * 2); size_t l_string_len = dap_enc_base64_decode(a_string_base64, l_string_base64_len, l_string, DAP_ENC_DATA_TYPE_B64_URLSAFE); if(!l_string_len){ diff --git a/dap-sdk/crypto/src/dap_enc_iaes.c b/dap-sdk/crypto/src/dap_enc_iaes.c index 0e4df9e74a1add551155ec2a531c2b0d27f5e567..29ef751860de7e58f12962727451d8b7b8d6981f 100755 --- a/dap-sdk/crypto/src/dap_enc_iaes.c +++ b/dap-sdk/crypto/src/dap_enc_iaes.c @@ -105,8 +105,8 @@ size_t dap_enc_iaes256_cbc_decrypt_fast(struct dap_enc_key * a_key, const void * memcpy(&feedback[0], DAP_ENC_AES_KEY(a_key)->ivec, IAES_BLOCK_SIZE); memcpy(priv_key_swapped_endian, a_key->priv_key_data, sizeof(priv_key_swapped_endian)); - swap_endian(priv_key_swapped_endian, sizeof(priv_key_swapped_endian)/sizeof(uint32_t)); - Key_Shedule_for_decrypT(priv_key_swapped_endian, round_decrypt_key); + swap_endian((uint32_t*)priv_key_swapped_endian, sizeof(priv_key_swapped_endian)/sizeof(uint32_t)); + Key_Shedule_for_decrypT((uint32_t*)priv_key_swapped_endian, round_decrypt_key); void *data = buf_out; const void *cdata = a_in; diff --git a/dap-sdk/net/client/dap_client_http.c b/dap-sdk/net/client/dap_client_http.c index 3ca5ee9ddd49a2fc02c56ee10ffb654de1bab29d..6b6e39d2dbde4e15fd0626db98e5f0f5a8c7b0c8 100644 --- a/dap-sdk/net/client/dap_client_http.c +++ b/dap-sdk/net/client/dap_client_http.c @@ -219,7 +219,7 @@ static void s_http_read(dap_events_socket_t * a_es, void * arg) * @param a_es * @param arg */ -static void s_http_error(dap_events_socket_t * a_es, void * arg) +static void s_http_error(dap_events_socket_t * a_es, int arg) { log_it(L_INFO, "http client error"); dap_client_http_internal_t * l_client_http_internal = DAP_CLIENT_HTTP(a_es); @@ -228,7 +228,7 @@ static void s_http_error(dap_events_socket_t * a_es, void * arg) return; } if(l_client_http_internal->error_callback) - l_client_http_internal->error_callback((int)arg, l_client_http_internal->obj); + l_client_http_internal->error_callback(arg, l_client_http_internal->obj); // close connection a_es->kill_signal = true; diff --git a/dap-sdk/net/client/dap_client_pvt.c b/dap-sdk/net/client/dap_client_pvt.c index 674e6b5e9858bc643e701abd89d2e514ac5b44f2..1404f7e32f9289dd13e6e782969a0e7199362909 100644 --- a/dap-sdk/net/client/dap_client_pvt.c +++ b/dap-sdk/net/client/dap_client_pvt.c @@ -99,7 +99,7 @@ void m_request_error(int, void *); void m_es_stream_delete(dap_events_socket_t * a_es, void * arg); void m_es_stream_read(dap_events_socket_t * a_es, void * arg); void m_es_stream_write(dap_events_socket_t * a_es, void * arg); -void m_es_stream_error(dap_events_socket_t * a_es, void * arg); +void m_es_stream_error(dap_events_socket_t * a_es, int a_arg); /** * @brief dap_client_internal_init @@ -1313,7 +1313,7 @@ void m_es_stream_write(dap_events_socket_t * a_es, void * arg) } } -void m_es_stream_error(dap_events_socket_t * a_es, void * arg) +void m_es_stream_error(dap_events_socket_t * a_es, int a_arg) { //dap_client_t * l_client = DAP_CLIENT(a_es); //dap_client_pvt_t * l_client_pvt = (l_client) ? DAP_CLIENT_PVT(l_client) : NULL; @@ -1322,6 +1322,6 @@ void m_es_stream_error(dap_events_socket_t * a_es, void * arg) log_it(L_ERROR, "m_es_stream_error: l_client_pvt is NULL!"); return; } - log_it(L_INFO, "m_es_stream_error"); + log_it(L_INFO, "m_es_stream_error: code %d", a_arg); } diff --git a/dap-sdk/net/client/include/dap_client_http.h b/dap-sdk/net/client/include/dap_client_http.h index ebf0df092b03f074debaa5d35b05249998485cb8..ec17cdbae2c758b2f40896b1ab2b0ac2517ea314 100644 --- a/dap-sdk/net/client/include/dap_client_http.h +++ b/dap-sdk/net/client/include/dap_client_http.h @@ -22,7 +22,7 @@ #pragma once #include <stdint.h> - +#include <stddef.h> #ifdef __cplusplus extern "C" { #endif diff --git a/dap-sdk/net/core/dap_server.c b/dap-sdk/net/core/dap_server.c index 5f5f5e417b4cad383d6ce69206617df9a4db50f7..064a1fa693cf7961fc9c75c01442d2e0c47b0590 100644 --- a/dap-sdk/net/core/dap_server.c +++ b/dap-sdk/net/core/dap_server.c @@ -59,7 +59,7 @@ #define LOG_TAG "dap_server" static void s_es_server_accept(dap_events_socket_t *a_es, int a_remote_socket, struct sockaddr* a_remote_addr); -static void s_es_server_error(dap_events_socket_t *a_es, void * a_arg); +static void s_es_server_error(dap_events_socket_t *a_es, int a_arg); static void s_es_server_new(dap_events_socket_t *a_es, void * a_arg); static void s_server_delete(dap_server_t * a_server); @@ -193,6 +193,8 @@ static void s_es_server_new(dap_events_socket_t *a_es, void * a_arg) { log_it(L_DEBUG, "Created server socket %p on worker %u", a_es, a_es->worker->id); dap_server_t *l_server = (dap_server_t*) a_es->_inheritor; + pthread_mutex_lock( &l_server->started_mutex); + pthread_mutex_unlock( &l_server->started_mutex); pthread_cond_broadcast( &l_server->started_cond); } @@ -201,7 +203,7 @@ static void s_es_server_new(dap_events_socket_t *a_es, void * a_arg) * @param a_es * @param a_arg */ -static void s_es_server_error(dap_events_socket_t *a_es, void * a_arg) +static void s_es_server_error(dap_events_socket_t *a_es, int a_arg) { (void) a_arg; (void) a_es; diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c index 420057c06a31abe110435b465c86b313639a626f..f849d65513dfe62920877654d0710b7e3b921fef 100644 --- a/dap-sdk/net/core/dap_worker.c +++ b/dap-sdk/net/core/dap_worker.c @@ -150,7 +150,7 @@ void *dap_worker_thread(void *arg) default: ; } l_cur->flags |= DAP_SOCK_SIGNAL_CLOSE; - l_cur->callbacks.error_callback(l_cur, NULL); // Call callback to process error event + l_cur->callbacks.error_callback(l_cur, 0); // Call callback to process error event } if (l_epoll_events[n].events & EPOLLRDHUP) { @@ -494,7 +494,7 @@ static void s_socket_all_check_activity( void * a_arg) if ( !l_es->kill_signal && l_curtime >= (time_t)l_es->last_time_active + s_connection_timeout && !l_es->no_close ) { log_it( L_INFO, "Socket %u timeout, closing...", l_es->socket ); if (l_es->callbacks.error_callback) { - l_es->callbacks.error_callback(l_es, (void *)ETIMEDOUT); + l_es->callbacks.error_callback(l_es, ETIMEDOUT); } dap_events_socket_remove_and_delete_mt( l_worker, l_es); } diff --git a/dap-sdk/net/core/include/dap_events.h b/dap-sdk/net/core/include/dap_events.h index deb9b0e516e6f4f6c834344b2d4f81c371246e92..4ba95b55293f78c93945887eb2cd7429d1e48c1d 100644 --- a/dap-sdk/net/core/include/dap_events.h +++ b/dap-sdk/net/core/include/dap_events.h @@ -22,7 +22,7 @@ along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ #pragma once - +#include <pthread.h> #include "uthash.h" #include "dap_events_socket.h" #include "dap_server.h" diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h index 83f6627ab7ecffa5e4ab64594999748a3db10c08..a5a0c39890592820b3fb48574387135282c037ab 100644 --- a/dap-sdk/net/core/include/dap_events_socket.h +++ b/dap-sdk/net/core/include/dap_events_socket.h @@ -72,6 +72,7 @@ typedef struct dap_worker dap_worker_t; typedef struct dap_server dap_server_t; typedef void (*dap_events_socket_callback_t) (dap_events_socket_t *,void * ); // Callback for specific client operations +typedef void (*dap_events_socket_callback_error_t) (dap_events_socket_t *, int ); // Callback for specific client operations typedef void (*dap_events_socket_callback_queue_t) (dap_events_socket_t *,const void * , size_t); // Callback for specific client operations typedef void (*dap_events_socket_callback_event_t) (dap_events_socket_t *, uint64_t); // Callback for specific client operations typedef void (*dap_events_socket_callback_pipe_t) (dap_events_socket_t *,const void * , size_t); // Callback for specific client operations @@ -95,7 +96,7 @@ typedef struct dap_events_socket_callbacks { dap_events_socket_callback_t delete_callback; // Delete client callback dap_events_socket_callback_t read_callback; // Read function dap_events_socket_callback_t write_callback; // Write function - dap_events_socket_callback_t error_callback; // Error processing function + dap_events_socket_callback_error_t error_callback; // Error processing function dap_events_socket_worker_callback_t worker_assign_callback; // After successful worker assign dap_events_socket_worker_callback_t worker_unassign_callback; // After successful worker unassign diff --git a/dap-sdk/net/server/http_server/dap_http.c b/dap-sdk/net/server/http_server/dap_http.c index 5246f0b5fe7183cd6aadc618fff7cd7cf89cd82a..d28c653537df9cd4a78b4d8b1d61fe121fa7eaa6 100644 --- a/dap-sdk/net/server/http_server/dap_http.c +++ b/dap-sdk/net/server/http_server/dap_http.c @@ -144,7 +144,7 @@ void dap_http_add_proc(dap_http_t *sh, const char *url_path, void *internal ,dap_http_client_callback_t headers_write_callback ,dap_http_client_callback_t data_read_callback ,dap_http_client_callback_t data_write_callback - ,dap_http_client_callback_t error_callback + ,dap_http_client_callback_error_t error_callback ) { diff --git a/dap-sdk/net/server/http_server/http_client/dap_http_client.c b/dap-sdk/net/server/http_server/http_client/dap_http_client.c index ac0b171d04854632575f29e8c53cfe045d823b2f..9d10fffe5d7b69d629b2614d7c29da1bf6e34ece 100644 --- a/dap-sdk/net/server/http_server/http_client/dap_http_client.c +++ b/dap-sdk/net/server/http_server/http_client/dap_http_client.c @@ -635,7 +635,7 @@ void dap_http_client_out_header_generate(dap_http_client_t *cl_ht) * @param cl HTTP Client instance * @param arg Additional argument (usualy not used) */ -void dap_http_client_error( dap_events_socket_t *cl, void *arg ) +void dap_http_client_error( dap_events_socket_t *cl, int arg ) { (void) arg; diff --git a/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h b/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h index f0e42c77b068588b9986951a0650923c96b54860..864233216d48cfb1fda03baacfcb1c1b2f909bb7 100644 --- a/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h +++ b/dap-sdk/net/server/http_server/http_client/include/dap_http_client.h @@ -35,6 +35,7 @@ typedef enum dap_http_client_state{ } dap_http_client_state_t; typedef void (*dap_http_client_callback_t) (struct dap_http_client *,void * arg); // Callback for specific client operations +typedef void (*dap_http_client_callback_error_t) (struct dap_http_client *,int); // Callback for specific client operations typedef struct dap_http_client { @@ -88,7 +89,7 @@ void dap_http_client_delete( dap_events_socket_t * cl,void *arg ); // Free memor void dap_http_client_read( dap_events_socket_t * cl,void *arg ); // Process read event void dap_http_client_write( dap_events_socket_t * cl,void *arg ); // Process write event -void dap_http_client_error( dap_events_socket_t * cl,void *arg ); // Process error event +void dap_http_client_error( dap_events_socket_t * cl,int arg ); // Process error event void dap_http_client_out_header_generate( dap_http_client_t *cl_ht ); #ifdef __cplusplus diff --git a/dap-sdk/net/server/http_server/include/dap_http.h b/dap-sdk/net/server/http_server/include/dap_http.h index 0dd9e5bd0e6ae227513db9a14e3e77478e9a5cc6..0d1fcfb84f5ff0d6ddc30451e8f225c2537cc974 100644 --- a/dap-sdk/net/server/http_server/include/dap_http.h +++ b/dap-sdk/net/server/http_server/include/dap_http.h @@ -45,7 +45,7 @@ typedef struct dap_http_url_proc{ dap_http_client_callback_t data_read_callback; dap_http_client_callback_t data_write_callback; - dap_http_client_callback_t error_callback; + dap_http_client_callback_error_t error_callback; dap_http_client_callback_t access_callback; @@ -75,5 +75,5 @@ void dap_http_add_proc(dap_http_t *sh, const char *url_path, void *internal ,dap_http_client_callback_t headers_write_callback ,dap_http_client_callback_t data_read_callback ,dap_http_client_callback_t data_write_callback - ,dap_http_client_callback_t error_callback ); // Add custom procesor for the HTTP server + ,dap_http_client_callback_error_t error_callback ); // Add custom procesor for the HTTP server diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index dd0910e8f6d156746a39d7f02766a4ed672533ac..b7d05539b15f8fd2de45a09918ff039f52b82cfa 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -24,7 +24,7 @@ #include <dap_chain_ledger.h> #include <sys/types.h> #include <dirent.h> - +#include <stdc-predef.h> #include <unistd.h> #include "dap_common.h" @@ -255,9 +255,9 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha // Recognize chains id if ( (l_chain_id_str = dap_config_get_item_str(l_cfg,"chain","id")) != NULL ){ - if ( sscanf(l_chain_id_str,"0x%016llX",& l_chain_id_u ) !=1 ){ - if ( sscanf(l_chain_id_str,"0x%016llx",&l_chain_id_u) !=1 ) { - if ( sscanf(l_chain_id_str,"%llu",&l_chain_id_u ) !=1 ){ + if ( sscanf(l_chain_id_str,"0x%"DAP_UINT64_FORMAT_X,& l_chain_id_u ) !=1 ){ + if ( sscanf(l_chain_id_str,"0x%"DAP_UINT64_FORMAT_x,&l_chain_id_u) !=1 ) { + if ( sscanf(l_chain_id_str,"%"DAP_UINT64_FORMAT_u,&l_chain_id_u ) !=1 ){ log_it (L_ERROR,"Can't recognize '%s' string as chain net id, hex or dec",l_chain_id_str); dap_config_close(l_cfg); return NULL; @@ -269,7 +269,7 @@ dap_chain_t * dap_chain_load_from_cfg(dap_ledger_t* a_ledger, const char * a_cha if (l_chain_id_str ) { - log_it (L_NOTICE, "Chain id 0x%016lX ( \"%s\" )",l_chain_id.uint64 , l_chain_id_str) ; + log_it (L_NOTICE, "Chain id 0x%016"DAP_UINT64_FORMAT_x" ( \"%s\" )",l_chain_id.uint64 , l_chain_id_str) ; }else { log_it (L_ERROR,"Wasn't recognized '%s' string as chain net id, hex or dec",l_chain_id_str); dap_config_close(l_cfg); diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 4d7f76f0aa01c735677f9d345b2e5ccd78bfb01a..cb84cba7ab0887ef6f28847e2e6d44d04e95df0d 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -134,7 +134,7 @@ int dap_chain_cell_load(dap_chain_t * a_chain, const char * a_cell_file_path) if ( l_element_size > 0 ){ dap_chain_atom_ptr_t * l_element = DAP_NEW_Z_SIZE (dap_chain_atom_ptr_t, l_element_size ); if ( fread( l_element,1,l_element_size,l_cell->file_storage ) == l_element_size ) { - a_chain->callback_atom_add (a_chain, l_element ); + a_chain->callback_atom_add (a_chain, l_element, l_element_size); } } else { log_it (L_ERROR, "Zero element size, file is corrupted"); @@ -270,13 +270,12 @@ int dap_chain_cell_file_update( dap_chain_cell_t * a_cell) if ( a_cell->file_storage ){ dap_chain_t * l_chain = a_cell->chain; dap_chain_atom_iter_t *l_atom_iter = l_chain->callback_atom_iter_create (l_chain); - dap_chain_atom_ptr_t *l_atom = l_chain->callback_atom_iter_get_first(l_atom_iter); - size_t l_atom_size = l_chain->callback_atom_get_size(l_atom); + size_t l_atom_size = 0; + dap_chain_atom_ptr_t *l_atom = l_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); while ( l_atom && l_atom_size){ if ( dap_chain_cell_file_append (a_cell,l_atom, l_atom_size) <0 ) break; - l_atom = l_chain->callback_atom_iter_get_next( l_atom_iter ); - l_atom_size = l_chain->callback_atom_get_size(l_atom); + l_atom = l_chain->callback_atom_iter_get_next( l_atom_iter, &l_atom_size ); } }else { log_it (L_ERROR,"Can't write cell 0x%016X file \"%s\"",a_cell->id.uint64, a_cell->file_storage_path); diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 0888d5eaa2a8de225cb84c9666365042581c0872..77ade0bd80fce0512faed6f5f607fa3b5a9c4dc4 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -45,6 +45,7 @@ typedef void * dap_chain_atom_ptr_t; typedef struct dap_chain_atom_iter{ dap_chain_t * chain; dap_chain_atom_ptr_t cur; + size_t cur_size; void * cur_item; void * _inheritor; } dap_chain_atom_iter_t; @@ -62,22 +63,20 @@ typedef void (*dap_chain_callback_t)(dap_chain_t *); typedef int (*dap_chain_callback_new_cfg_t)(dap_chain_t*, dap_config_t *); typedef void (*dap_chain_callback_ptr_t)(dap_chain_t *, void * ); -typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_t)(dap_chain_t *, dap_chain_atom_ptr_t ); -typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t ); -typedef int (*dap_chain_callback_atom_size_t)(dap_chain_t *, dap_chain_atom_ptr_t ,size_t); +typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_t)(dap_chain_t *, dap_chain_atom_ptr_t, size_t ); +typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t , size_t); typedef size_t (*dap_chain_callback_atom_get_hdr_size_t)(void); -typedef size_t (*dap_chain_callback_atom_hdr_get_size_t)(dap_chain_atom_ptr_t ); typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t * ); -typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_from_t)(dap_chain_t * ,dap_chain_atom_ptr_t); -typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * ); -typedef dap_chain_datum_t* (*dap_chain_callback_atom_get_datum)(dap_chain_atom_ptr_t ); -typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_find_by_hash_t)(dap_chain_atom_iter_t * ,dap_chain_hash_fast_t *); +typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_from_t)(dap_chain_t * ,dap_chain_atom_ptr_t, size_t); +typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * , size_t*); +typedef dap_chain_datum_t* (*dap_chain_callback_atom_get_datum)(dap_chain_atom_ptr_t, size_t ); +typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_find_by_hash_t)(dap_chain_atom_iter_t * ,dap_chain_hash_fast_t *,size_t*); typedef dap_chain_datum_tx_t* (*dap_chain_callback_tx_find_by_hash_t)(dap_chain_t * ,dap_chain_hash_fast_t *); -typedef dap_chain_atom_ptr_t * (*dap_chain_callback_atom_iter_get_atoms_t)(dap_chain_atom_iter_t * ,size_t * ); +typedef dap_chain_atom_ptr_t * (*dap_chain_callback_atom_iter_get_atoms_t)(dap_chain_atom_iter_t * ,size_t* ,size_t**); -typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_next_t)(dap_chain_atom_iter_t * ); +typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_next_t)(dap_chain_atom_iter_t * ,size_t*); typedef void (*dap_chain_callback_atom_iter_delete_t)(dap_chain_atom_iter_t * ); typedef size_t (*dap_chain_datum_callback_datum_pool_proc_add_t)(dap_chain_t * , dap_chain_datum_t **, size_t ); @@ -126,7 +125,6 @@ typedef struct dap_chain{ dap_chain_datum_callback_datum_pool_proc_add_with_group_t callback_datums_pool_proc_with_group; dap_chain_callback_atom_get_hdr_size_t callback_atom_get_hdr_static_size; // Get atom header's size - dap_chain_callback_atom_hdr_get_size_t callback_atom_get_size; // Get atom's size from header dap_chain_callback_atom_iter_create_t callback_atom_iter_create; dap_chain_callback_atom_iter_create_from_t callback_atom_iter_create_from; diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 119cc5b7ba7317d6969e05139939a9af9a77efd0..b24e58fdc6a6cc80ecca8792b046c487cd7bad03 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -203,15 +203,16 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } dap_chain_atom_ptr_t * l_lasts = NULL; - size_t l_lasts_size = 0; + size_t *l_lasts_sizes = NULL; + size_t l_lasts_count = 0; dap_chain_atom_iter_t* l_iter = l_chain->callback_atom_iter_create(l_chain); l_ch_chain->request_atom_iter = l_iter; - l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_size); - if(l_lasts) { - for(size_t i = 0; i < l_lasts_size; i++) { + l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_count, &l_lasts_sizes); + if(l_lasts&& l_lasts_sizes) { + for(size_t i = 0; i < l_lasts_count; i++) { dap_chain_atom_item_t * l_item = NULL; dap_chain_hash_fast_t l_atom_hash; - dap_hash_fast(l_lasts[i], l_chain->callback_atom_get_size(l_lasts[i]), + dap_hash_fast(l_lasts[i], l_lasts_sizes[i], &l_atom_hash); pthread_mutex_lock(&l_ch_chain->mutex); HASH_FIND(hh, l_ch_chain->request_atoms_lasts, &l_atom_hash, sizeof(l_atom_hash), @@ -238,8 +239,8 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } else { // last packet - dap_stream_ch_chain_sync_request_t l_request = { { 0 } }; - l_request.id_start = 0;//dap_db_log_get_last_id_remote(l_ch_chain->request.node_addr.uint64); + dap_stream_ch_chain_sync_request_t l_request; + memset(&l_request,0,sizeof (l_request)); dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS, l_ch_chain->request_net_id, l_ch_chain->request_chain_id, l_ch_chain->request_cell_id, &l_request, sizeof(l_request)); @@ -356,10 +357,11 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) dap_chain_hash_fast_t l_atom_hash = {}; dap_hash_fast(l_chain_pkt->data, l_chain_pkt_data_size, &l_atom_hash); dap_chain_atom_iter_t *l_atom_iter = l_chain->callback_atom_iter_create(l_chain); - if (!l_chain->callback_atom_find_by_hash(l_atom_iter, &l_atom_hash)) { + size_t l_atom_size =0; + if ( l_chain->callback_atom_find_by_hash(l_atom_iter, &l_atom_hash, &l_atom_size) != NULL ) { dap_chain_atom_ptr_t l_atom_copy = DAP_CALLOC(1, l_chain_pkt_data_size); memcpy(l_atom_copy, l_chain_pkt->data, l_chain_pkt_data_size); - dap_chain_atom_verify_res_t l_atom_add_res = l_chain->callback_atom_add(l_chain, l_atom_copy); + dap_chain_atom_verify_res_t l_atom_add_res = l_chain->callback_atom_add(l_chain, l_atom_copy,l_chain_pkt_data_size); if(l_atom_add_res == ATOM_ACCEPT && dap_chain_has_file_store(l_chain)) { // append to file dap_chain_cell_id_t l_cell_id; @@ -468,10 +470,12 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) // apply received transaction 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) { - if(l_chain->callback_datums_pool_proc_with_group) + if(l_chain->callback_datums_pool_proc_with_group){ + void * restrict l_store_obj_value = l_store_obj->value; l_chain->callback_datums_pool_proc_with_group(l_chain, - (dap_chain_datum_t**) &(l_store_obj->value), 1, + (dap_chain_datum_t** restrict) l_store_obj_value, 1, l_store_obj[i].group); + } } // save data to global_db if(!dap_chain_global_db_obj_save(l_obj, 1)) { @@ -698,7 +702,8 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) dap_chain_atom_item_t * l_atom_item = NULL, *l_atom_item_tmp = NULL;//, *l_chains_lasts_new = NULL; if(l_ch_chain->request_atoms_lasts == NULL) { // All chains synced - dap_stream_ch_chain_sync_request_t l_request = { { 0 } }; + dap_stream_ch_chain_sync_request_t l_request; + memset(&l_request,0,sizeof (l_request)); uint8_t l_send_pkt_type = l_ch_chain->state == CHAIN_STATE_SYNC_CHAINS ? DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS : DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_ALL; @@ -729,7 +734,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) l_atom_item_proc); // Then flush it out to the remote - size_t l_atom_size = l_chain->callback_atom_get_size(l_atom_item->atom); + size_t l_atom_size = l_atom_item->atom_size; dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, l_ch_chain->request_net_id, l_ch_chain->request_chain_id, l_ch_chain->request_cell_id, l_atom_item->atom, l_atom_size); @@ -737,31 +742,33 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) // Then parse links and populate new lasts size_t l_lasts_size = 0; dap_chain_atom_ptr_t * l_links = NULL; + size_t *l_links_sizes = NULL; - dap_chain_atom_iter_t* l_iter = l_chain->callback_atom_iter_create_from(l_chain, l_atom_item->atom); - l_links = l_chain->callback_atom_iter_get_links(l_iter, &l_lasts_size); - //DAP_DELETE(l_atom_item->atom); + dap_chain_atom_iter_t* l_iter = l_chain->callback_atom_iter_create_from(l_chain, l_atom_item->atom, l_atom_item->atom_size); + l_links = l_chain->callback_atom_iter_get_links(l_iter, &l_lasts_size,&l_links_sizes); DAP_DELETE(l_iter); - //l_links = l_chain->callback_atom_iter_get_links(l_atom_item->atom, &l_lasts_size); - - for(size_t i = 0; i < l_lasts_size; i++) { // Find links - dap_chain_atom_item_t * l_link_item = NULL; - dap_chain_hash_fast_t l_link_hash; - dap_hash_fast(l_links[i], l_chain->callback_atom_get_size(l_links[i]), - &l_link_hash); - // Check link in processed atims - HASH_FIND(hh, l_ch_chain->request_atoms_processed, &l_link_hash, sizeof(l_link_hash), l_link_item); - if(l_link_item == NULL) { // Not found, add new lasts - l_link_item = DAP_NEW_Z(dap_chain_atom_item_t); - l_link_item->atom = l_links[i];// do not use memory cause it will be deleted - memcpy(&l_link_item->atom_hash, &l_link_hash, sizeof(l_link_hash)); - //HASH_ADD(hh, l_chains_lasts_new, atom_hash, sizeof(l_link_hash), l_link_item); - HASH_ADD(hh, l_ch_chain->request_atoms_lasts, atom_hash, sizeof(l_link_hash), l_link_item); + if( l_links&&l_links_sizes){ + //DAP_DELETE(l_atom_item->atom); + //l_links = l_chain->callback_atom_iter_get_links(l_atom_item->atom, &l_lasts_size); + + for(size_t i = 0; i < l_lasts_size; i++) { // Find links + dap_chain_atom_item_t * l_link_item = NULL; + dap_chain_hash_fast_t l_link_hash; + dap_hash_fast(l_links[i], l_links_sizes[i], &l_link_hash); + // Check link in processed atims + HASH_FIND(hh, l_ch_chain->request_atoms_processed, &l_link_hash, sizeof(l_link_hash), l_link_item); + if(l_link_item == NULL) { // Not found, add new lasts + l_link_item = DAP_NEW_Z(dap_chain_atom_item_t); + l_link_item->atom = l_links[i];// do not use memory cause it will be deleted + memcpy(&l_link_item->atom_hash, &l_link_hash, sizeof(l_link_hash)); + //HASH_ADD(hh, l_chains_lasts_new, atom_hash, sizeof(l_link_hash), l_link_item); + HASH_ADD(hh, l_ch_chain->request_atoms_lasts, atom_hash, sizeof(l_link_hash), l_link_item); + } + //else + // DAP_DELETE(l_links[i]); } - //else - // DAP_DELETE(l_links[i]); + DAP_DELETE(l_links); } - DAP_DELETE(l_links); HASH_DEL(l_ch_chain->request_atoms_lasts, l_atom_item); break; } diff --git a/modules/channel/chain/include/dap_stream_ch_chain.h b/modules/channel/chain/include/dap_stream_ch_chain.h index 0e5e6793752fb76e882827b48c986ca4c75ed039..989a7ea97a43467bdcaa330d3e39314ad095f820 100644 --- a/modules/channel/chain/include/dap_stream_ch_chain.h +++ b/modules/channel/chain/include/dap_stream_ch_chain.h @@ -41,6 +41,7 @@ typedef void (*dap_stream_ch_chain_callback_packet_t)(dap_stream_ch_chain_t*, ui typedef struct dap_chain_atom_item{ dap_chain_hash_fast_t atom_hash; dap_chain_atom_ptr_t atom; + size_t atom_size; UT_hash_handle hh; } dap_chain_atom_item_t; diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index ac632bf6be2fc51c38ce3ee651cd95e6abffeba6..a2599f189e91e56e16315892d19ae7d49243a8ca 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -66,9 +66,9 @@ typedef struct dap_chain_cs_dag_poa_pvt static void s_callback_delete(dap_chain_cs_dag_t * a_dag); static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_cfg); -static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event); +static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size); static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count); + dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size); // CLI commands static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **str_reply); @@ -109,6 +109,7 @@ void dap_chain_cs_dag_poa_deinit(void) */ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_reply) { + (void) arg_func; int ret = -666; int arg_index = 1; dap_chain_net_t * l_chain_net = NULL; @@ -165,9 +166,9 @@ static int s_cli_dag_poa(int argc, char ** argv, void *arg_func, char **a_str_re l_event_hash_str); ret = -30; }else { - dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event,l_poa_pvt->events_sign_cert->enc_key ); + dap_chain_cs_dag_event_t *l_event_new = dap_chain_cs_dag_event_copy_with_sign_add(l_event, l_event_size,l_poa_pvt->events_sign_cert->enc_key ); dap_chain_hash_fast_t l_event_new_hash; - dap_chain_cs_dag_event_calc_hash(l_event_new,&l_event_new_hash); + dap_chain_cs_dag_event_calc_hash(l_event_new, l_event_size,&l_event_new_hash); //size_t l_event_new_size = dap_chain_cs_dag_event_calc_size(l_event_new); char * l_event_new_hash_hex_str = dap_chain_hash_fast_to_str_new(&l_event_new_hash); char * l_event_new_hash_base58_str = dap_enc_base58_encode_hash_to_str(&l_event_new_hash); @@ -319,7 +320,7 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag) * @return */ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count) + dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size) { dap_return_val_if_fail(a_dag && a_dag->chain && DAP_CHAIN_CS_DAG_POA(a_dag), NULL); dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name ); @@ -330,7 +331,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a } if ( s_seed_mode || (a_hashes && a_hashes_count) ){ dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new( a_dag->chain->id, l_net->pub.cell_id, a_datum, - PVT(l_poa)->events_sign_cert->enc_key, a_hashes, a_hashes_count); + PVT(l_poa)->events_sign_cert->enc_key, a_hashes, a_hashes_count,a_event_size); return l_event; }else return NULL; @@ -344,17 +345,29 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a * @param a_dag_event * @return */ -static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event) +static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size) { dap_chain_cs_dag_poa_pvt_t * l_poa_pvt = PVT ( DAP_CHAIN_CS_DAG_POA( a_dag ) ); + size_t l_offset_from_beginning = dap_chain_cs_dag_event_calc_size_excl_signs(a_dag_event,a_dag_event_size); + if( l_offset_from_beginning > a_dag_event_size){ + log_it(L_WARNING,"Incorrect size with event %p", a_dag_event); + return -7; // Incorrest size + } if ( a_dag_event->header.signs_count >= l_poa_pvt->auth_certs_count_verify ){ size_t l_verified = 0; for ( uint16_t i = 0; i < a_dag_event->header.signs_count; i++ ) { - dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, 0); + if (l_offset_from_beginning == a_dag_event_size) + break; + dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event,a_dag_event_size , 0); if ( l_sign == NULL){ log_it(L_WARNING, "Event is NOT signed with anything"); return -4; } + l_offset_from_beginning += dap_sign_get_size( l_sign); + if (l_offset_from_beginning > a_dag_event_size){ + log_it(L_WARNING,"Incorrect size with event %p", a_dag_event); + return -7; + } for (uint16_t j = 0; j < l_poa_pvt->auth_certs_count; j++) { if (dap_cert_compare_with_sign ( l_poa_pvt->auth_certs[j], l_sign) == 0) l_verified++; @@ -367,10 +380,11 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ } dap_chain_addr_t l_addr = {}; dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_dag->chain->net_id); - dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event); + dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event, a_dag_event_size); if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data; if (!dap_chain_net_srv_stake_validator(&l_addr, l_tx)) { + log_it(L_WARNING,"Not passed stake validator event %p", a_dag_event); return -6; } } @@ -378,7 +392,9 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ } return l_verified >= l_poa_pvt->auth_certs_count_verify ? 0 : -1; - }else - return -2; // Wrong signatures number + }else{ + log_it(L_WARNING,"Wrong signatures number with event %p", a_dag_event); + return -2; // Wrong signatures number + } } diff --git a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c index fc3337dcef13d408ac1a63ed4e7f89dc3a0e9c21..597ea51c63afaf5db0f92c5567c1fc847866389c 100644 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c @@ -49,9 +49,9 @@ typedef struct dap_chain_cs_dag_pos_pvt static void s_callback_delete(dap_chain_cs_dag_t * a_dag); static int s_callback_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg); static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_cfg); -static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event); +static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size); static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count); + dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t *a_dag_event_size); /** * @brief dap_chain_cs_dag_pos_init @@ -186,7 +186,8 @@ static void s_callback_delete(dap_chain_cs_dag_t * a_dag) * @return */ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a_dag, dap_chain_datum_t * a_datum, - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count) + dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, + size_t *a_dag_event_size) { dap_return_val_if_fail(a_dag && a_dag->chain && DAP_CHAIN_CS_DAG_POS(a_dag) && a_datum, NULL); dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name ); @@ -198,7 +199,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a } if(a_datum || (a_hashes && a_hashes_count)) { dap_chain_cs_dag_event_t * l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, l_net->pub.cell_id, a_datum, - PVT(l_pos)->events_sign_wallet->enc_key, a_hashes, a_hashes_count); + PVT(l_pos)->events_sign_wallet->enc_key, a_hashes, a_hashes_count, a_dag_event_size); return l_event; } else return NULL; @@ -210,21 +211,27 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a * @param a_dag_event * @return */ -static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event) +static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_event_t * a_dag_event, size_t a_dag_event_size) { dap_chain_cs_dag_pos_t * l_pos =DAP_CHAIN_CS_DAG_POS( a_dag ) ; dap_chain_cs_dag_pos_pvt_t * l_pos_pvt = PVT ( DAP_CHAIN_CS_DAG_POS( a_dag ) ); - if(a_dag->chain->ledger == NULL) + if(a_dag->chain->ledger == NULL){ + log_it(L_CRITICAL,"Ledger is NULL can't check PoS on this chain %s", a_dag->chain->name); return -3; + } + if (sizeof (a_dag_event->header)>= a_dag_event_size){ + log_it(L_WARNING,"Incorrect size with event %p on chain %s", a_dag_event, a_dag->chain->name); + return -7; + } if ( a_dag_event->header.signs_count >= l_pos_pvt->confirmations_minimum ){ uint16_t l_verified_num = 0; dap_chain_addr_t l_addr = { 0 }; for ( size_t l_sig_pos=0; l_sig_pos < a_dag_event->header.signs_count; l_sig_pos++ ){ - dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, 0); + dap_sign_t * l_sign = dap_chain_cs_dag_event_get_sign(a_dag_event, 0,a_dag_event_size); if ( l_sign == NULL){ log_it(L_WARNING, "Event is NOT signed with anything"); return -4; @@ -238,10 +245,11 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ dap_chain_addr_fill(&l_addr, l_sign->header.type, &l_pkey_hash, a_dag->chain->net_id); if (l_sig_pos == 0) { - dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event); + dap_chain_datum_t *l_datum = (dap_chain_datum_t *)dap_chain_cs_dag_event_get_datum(a_dag_event,a_dag_event_size); if (l_datum->header.type_id == DAP_CHAIN_DATUM_TX) { dap_chain_datum_tx_t *l_tx = (dap_chain_datum_tx_t *)l_datum->data; if (!dap_chain_net_srv_stake_validator(&l_addr, l_tx)) { + log_it(L_WARNING,"Not passed stake validator with event %p on chain %s", a_dag_event, a_dag->chain->name); return -6; } } @@ -287,6 +295,8 @@ static int s_callback_event_verify(dap_chain_cs_dag_t * a_dag, dap_chain_cs_dag_ log_it(L_WARNING, "Wrong event: only %su/%su signs are valid", l_verified_num, l_pos_pvt->confirmations_minimum ); return -2; } - }else - return -2; // Wrong signatures number + }else{ + log_it(L_WARNING,"Wrong signature number with event %p on chain %s", a_dag_event, a_dag->chain->name); + return -2; // Wrong signatures number + } } diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index 5086bc7adea914a2e9a423db8feeea8bec9a4572..f68ce988c17733f7bc2ef0354ae48308afc0ba96 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -68,30 +68,29 @@ typedef struct dap_chain_gdb_private static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_net); // Atomic element organization callbacks -static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t); // Accept new event in gdb -static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t); // Verify new event in gdb -static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t); // Get gdb event size +static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); // Accept new event in gdb +static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); // Verify new event in gdb static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get gdb event header size static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain); static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain, - dap_chain_atom_ptr_t a); + dap_chain_atom_ptr_t a, size_t a_atom_size); // Delete iterator static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter); // Get the fisrt event from gdb static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter, - dap_chain_hash_fast_t * a_atom_hash); + dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_tx_hash(dap_chain_atom_iter_t * a_atom_iter , - dap_chain_hash_fast_t * a_atom_hash); + dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); // Get event(s) from gdb -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter); // Get the fisrt event from gdb -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter); // Get the next event from gdb +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); // Get the fisrt event from gdb +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter, size_t * a_atom_size); // Get the next event from gdb static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter, - size_t * a_links_size_ptr); // Get list of linked events + size_t * a_links_size_ptr, size_t ** a_lasts_sizes_ptr); // Get list of linked events static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter, - size_t * a_lasts_size_ptr); // Get list of linked events + size_t * a_lasts_size_ptr, size_t ** a_lasts_sizes_ptr); // Get list of linked events static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain_datum_t ** a_datums, size_t a_datums_size); @@ -185,7 +184,6 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) // Atom element callbacks a_chain->callback_atom_add = s_chain_callback_atom_add; // Accept new element in chain a_chain->callback_atom_verify = s_chain_callback_atom_verify; // Verify new element in chain - a_chain->callback_atom_get_size = s_chain_callback_atom_hdr_get_size; // Get dag event size a_chain->callback_atom_get_hdr_static_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size a_chain->callback_atom_iter_create = s_chain_callback_atom_iter_create; @@ -263,7 +261,6 @@ const char* dap_chain_gdb_get_group(dap_chain_t * a_chain) static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_net) { dap_chain_gdb_private_t *l_gdb_priv = PVT(a_gdb); - dap_list_t *l_datum_list = NULL, *l_list_tmp = NULL; // protect from reloading if(dap_chain_ledger_count( a_net->pub.ledger ) > 0) return 0; @@ -275,19 +272,10 @@ static int dap_chain_gdb_ledger_load(dap_chain_gdb_t *a_gdb, dap_chain_net_t *a_ dap_global_db_obj_t *data = dap_chain_global_db_gr_load(l_gdb_priv->group_datums , &l_data_size); // make list of datums for(size_t i = 0; i < l_data_size; i++) { - l_datum_list = dap_list_append(l_datum_list, data[i].value); - } - // sort list by time - //l_datum_list = dap_list_sort(l_datum_list, (dap_callback_compare_t) compare_datum_items); - l_list_tmp = l_datum_list; - // add datum_tx from list to ledger - while(l_list_tmp) { - dap_chain_datum_t *l_datum = (dap_chain_datum_t*) l_list_tmp->data; - s_chain_callback_atom_add(a_gdb->chain,l_datum); - l_list_tmp = dap_list_next(l_list_tmp); + s_chain_callback_atom_add(a_gdb->chain,data[i].value, data[i].value_len); + } dap_chain_global_db_objs_delete(data, l_data_size); - dap_list_free(l_datum_list); return 0; } @@ -302,7 +290,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain { for(size_t i = 0; i < a_datums_count; i++) { dap_chain_datum_t * l_datum = a_datums[i]; - s_chain_callback_atom_add(a_chain, l_datum ); + s_chain_callback_atom_add(a_chain, l_datum,dap_chain_datum_size(l_datum) ); } return a_datums_count; } @@ -321,11 +309,16 @@ static size_t s_chain_callback_datums_pool_proc_with_group(dap_chain_t * a_chain * @param a_datums * @param a_datums_size */ -static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom) +static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_chain); dap_chain_gdb_private_t *l_gdb_priv = PVT(l_gdb); dap_chain_datum_t *l_datum = (dap_chain_datum_t*) a_atom; + if ( a_atom_size < l_datum->header.data_size+ sizeof (l_datum->header) ){ + log_it(L_INFO,"Corrupted atom rejected: wrong size %zd not equel or less atom size %zd",l_datum->header.data_size+ sizeof (l_datum->header), + a_atom_size); + return ATOM_REJECT; + } switch (l_datum->header.type_id) { case DAP_CHAIN_DATUM_TOKEN_DECL:{ dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; @@ -369,22 +362,14 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha * @param a_atom * @return */ -static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom) +static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { (void) a_chain; (void) a_atom; + (void) a_atom_size; return ATOM_ACCEPT; } -/** - * @brief s_chain_callback_atom_get_size Get size of atomic element - * @param a_atom - * @return - */ -static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t a_atom) -{ - return ((dap_chain_datum_t *) a_atom)->header.data_size +sizeof (((dap_chain_datum_t *) a_atom)->header); -} /** * @brief s_chain_callback_atom_get_static_hdr_size @@ -416,7 +401,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_ * @return */ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain, - dap_chain_atom_ptr_t a_atom) + dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_iter->chain = a_chain; @@ -441,7 +426,7 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite * @return */ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter, - dap_chain_hash_fast_t * a_atom_hash) + dap_chain_hash_fast_t * a_atom_hash, size_t *a_atom_size) { char * l_key = dap_chain_hash_fast_to_str_new(a_atom_hash); size_t l_ret_size; @@ -449,6 +434,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at dap_chain_gdb_t * l_gdb = DAP_CHAIN_GDB(a_atom_iter->chain ); l_ret = dap_chain_global_db_gr_get(l_key,&l_ret_size, PVT ( l_gdb )->group_datums ); + *a_atom_size = l_ret_size; return l_ret; } @@ -457,7 +443,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at * @param a_atom_iter * @return */ -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter) +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size) { dap_chain_datum_t * l_datum = NULL; a_atom_iter->cur_item = PVT ( DAP_CHAIN_GDB(a_atom_iter->chain) )->hash_items; @@ -468,7 +454,9 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it DAP_DELETE( a_atom_iter->cur); a_atom_iter->cur = l_datum; - } + *a_atom_size = l_datum_size; + }else + *a_atom_size = 0; return l_datum; } @@ -477,7 +465,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ * @param a_atom_iter * @return */ -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter) +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_iter_t * a_atom_iter,size_t *a_atom_size) { dap_chain_datum_t * l_datum = NULL; a_atom_iter->cur_item = a_atom_iter->cur_item? @@ -490,7 +478,9 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_i if (a_atom_iter->cur) // This iterator should clean up data for it because its allocate it DAP_DELETE( a_atom_iter->cur); a_atom_iter->cur = l_datum; - } + *a_atom_size = l_datum_size; + }else + *a_atom_size = 0; return l_datum; } @@ -501,10 +491,11 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next(dap_chain_atom_i * @return */ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom_iter_t * a_atom_iter, - size_t * a_links_size_ptr) + size_t * a_links_size_ptr, size_t **a_links_sizes_ptr) { (void) a_atom_iter; (void) a_links_size_ptr; + (void) a_links_sizes_ptr; return NULL; } @@ -515,10 +506,11 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links(dap_chain_atom * @return */ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts(dap_chain_atom_iter_t * a_atom_iter, - size_t * a_lasts_size_ptr) + size_t * a_lasts_size_ptr, size_t **a_links_sizes_ptr) { (void) a_atom_iter; (void) a_lasts_size_ptr; + (void) a_links_sizes_ptr; return NULL; } diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 887be69c07e3d2ce86ff94194262325b0bcc61c4..37b0b25d47ec8e6019c5961ad0ebcb3e57401e71 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -23,11 +23,12 @@ along with any DAP based project. If not, see <http://www.gnu.org/licenses/>. */ - #include <stdlib.h> -#define _XOPEN_SOURCE /* See feature_test_macros(7) */ +#include <stdint.h> +#include <stddef.h> #include <stdio.h> -#include <time.h> + + #include <stdlib.h> #include <stddef.h> #include <stdint.h> @@ -88,7 +89,9 @@ #include <dirent.h> #define _XOPEN_SOURCE /* See feature_test_macros(7) */ +#ifndef __USE_XOPEN #define __USE_XOPEN +#endif #define _GNU_SOURCE #include <time.h> @@ -757,8 +760,7 @@ static dap_chain_net_t *s_net_new(const char * a_id, const char * a_name , PVT(ret)->state_proc_cond = CreateEventA( NULL, FALSE, FALSE, NULL ); #endif - // if ( sscanf(a_id,"0x%016lx", &ret->pub.id.uint64 ) == 1 ){ - if ( sscanf(a_id,"0x%016llx", &ret->pub.id.uint64 ) == 1 ){ + if ( sscanf(a_id,"0x%016lx", &ret->pub.id.uint64 ) == 1 ){ if (strcmp (a_node_role, "root_master")==0){ PVT(ret)->node_role.enums = NODE_ROLE_ROOT_MASTER; log_it (L_NOTICE, "Node role \"root master\" selected"); @@ -1530,7 +1532,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) else{ l_node_addr = DAP_NEW_Z(dap_chain_node_addr_t); bool parse_succesfully = false; - if ( sscanf(l_node_addr_str, "0x%016llx",&l_node_addr->uint64 ) == 1 ){ + if ( sscanf(l_node_addr_str, "0x%016" DAP_UINT64_FORMAT_x ,&l_node_addr->uint64 ) == 1 ){ log_it(L_DEBUG, "Parse node address with format 0x016llx"); parse_succesfully = true; } @@ -1684,7 +1686,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) char ** l_proc_chains = dap_config_get_array_str(l_cfg,"role-master" , "proc_chains", &l_proc_chains_count ); for ( size_t i = 0; i< l_proc_chains_count ; i++){ dap_chain_id_t l_chain_id = {{0}}; - if(dap_sscanf( l_proc_chains[i], "0x%16llX", &l_chain_id.uint64) ==1 || dap_scanf("0x%16llx", &l_chain_id.uint64) == 1){ + if(dap_sscanf( l_proc_chains[i], "0x%16"DAP_UINT64_FORMAT_X, &l_chain_id.uint64) ==1 || dap_scanf("0x%16"DAP_UINT64_FORMAT_x, &l_chain_id.uint64) == 1){ dap_chain_t * l_chain = dap_chain_find_by_id(l_net->pub.id, l_chain_id ); if ( l_chain ){ l_chain->is_datum_pool_proc = true; diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index edd503ee2fc05db4695eba355144bcbcd6ef75f4..6c3f58918094a1439dc9d335ea7d3d682f56caec 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -2001,7 +2001,7 @@ int com_token_decl_sign(int argc, char ** argv, void *arg_func, char ** a_str_re } } -void s_com_mempool_list_print_for_chain(const dap_chain_net_t * a_net, const dap_chain_t * a_chain, dap_string_t * a_str_tmp, const char *a_hash_out_type){ +void s_com_mempool_list_print_for_chain(dap_chain_net_t * a_net, dap_chain_t * a_chain, dap_string_t * a_str_tmp, const char *a_hash_out_type){ char * l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool(a_chain); if(!l_gdb_group_mempool){ dap_string_append_printf(a_str_tmp, "%s.%s: chain not found\n", a_net->pub.name, a_chain->name); diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index c34c4e7e817e7b5ea945fdadd717d4e4b9c8a01a..7838fc19203efa50aca9f8872f2f8f8d41a798e5 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -94,15 +94,14 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, dap_tx_data_t *l_tx_data_hash = NULL; // load transactions dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - dap_chain_atom_ptr_t *l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter); - size_t l_atom_size = a_chain->callback_atom_get_size(l_atom); + size_t l_atom_size = 0; + dap_chain_atom_ptr_t *l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); while(l_atom && l_atom_size) { dap_chain_datum_t *l_datum = (dap_chain_datum_t*) l_atom; if(!l_datum && l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - l_atom_size = a_chain->callback_atom_get_size(l_atom); + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); continue; } dap_tx_data_t *l_tx_data = NULL; @@ -181,8 +180,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, // search tx with a_tx_hash if(!dap_hash_fast_compare(a_tx_hash, &l_tx_hash)) { // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - l_atom_size = a_chain->callback_atom_get_size(l_atom); + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); continue; } // found a_tx_hash now @@ -200,7 +198,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, l_list_tmp = l_list_out_items; while(l_list_tmp) { const dap_chain_tx_out_t *l_tx_out = (const dap_chain_tx_out_t*) l_list_tmp->data; - dap_tx_data_t *l_tx_data_prev = NULL; + //dap_tx_data_t *l_tx_data_prev = NULL; const char *l_token_str = NULL; if(l_tx_data) @@ -311,18 +309,18 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons dap_tx_data_t *l_tx_data_hash = NULL; // load transactions dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain); - dap_chain_atom_ptr_t *l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter); + size_t l_atom_size=0; + dap_chain_atom_ptr_t *l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); if (!l_atom) { return NULL; } - size_t l_atom_size = a_chain->callback_atom_get_size(l_atom); while(l_atom && l_atom_size) { - dap_chain_datum_t *l_datum = a_chain->callback_atom_get_datum ? a_chain->callback_atom_get_datum(l_atom) : (dap_chain_datum_t*)l_atom; + dap_chain_datum_t *l_datum = a_chain->callback_atom_get_datum ? a_chain->callback_atom_get_datum(l_atom, l_atom_size) : + (dap_chain_datum_t*)l_atom; if(!l_datum || l_datum->header.type_id != DAP_CHAIN_DATUM_TX) { // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - l_atom_size = a_chain->callback_atom_get_size(l_atom); + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); continue; } // transaction @@ -656,8 +654,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons DAP_DELETE(l_time_str); // go to next transaction - l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter); - l_atom_size = l_atom ? a_chain->callback_atom_get_size(l_atom) : 0; + l_atom = a_chain->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); } // delete hashes diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index 1721ea01210137059b81437b876058a15908f3c7..11a8c3a0dd8f9455586d1cd22e0bf472db7b70ad 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -288,7 +288,7 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha dap_db_log_list_t *l_db_log = NULL; // If the current global_db has been truncated, but the remote node has not known this uint64_t l_last_id = dap_db_log_get_last_id(); - if(l_request->id_start > a_ch_chain->request_last_ts){ + if(l_request->id_start > (uint64_t) a_ch_chain->request_last_ts){ dap_chain_net_t *l_net = dap_chain_net_by_id(a_pkt->hdr.net_id); dap_list_t *l_add_groups = dap_chain_net_get_add_gdb_group(l_net, a_ch_chain->request.node_addr); l_db_log = dap_db_log_list_start(l_start_item + 1, l_add_groups); @@ -330,12 +330,13 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha dap_chain_atom_ptr_t * l_lasts = NULL; size_t l_lasts_size = 0; - l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_size); + size_t *l_lasts_sizes = NULL; + l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_size, &l_lasts_sizes); if ( l_lasts){ for(size_t i = 0; i < l_lasts_size; i++) { dap_chain_atom_item_t * l_item = NULL; dap_chain_hash_fast_t l_atom_hash; - dap_hash_fast(l_lasts[i], l_chain->callback_atom_get_size(l_lasts[i]), &l_atom_hash); + dap_hash_fast(l_lasts[i], l_lasts_sizes[i], &l_atom_hash); pthread_mutex_lock(&a_ch_chain->mutex); HASH_FIND(hh, a_ch_chain->request_atoms_lasts, &l_atom_hash, sizeof(l_atom_hash), l_item); if(l_item == NULL) { // Not found, add new lasts diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c index c9f43454f35b06cfe2e9e6b5e58bb4337d21ae66..595a2802107b989c6d0c02a0a9c5a4d27b07934e 100644 --- a/modules/net/srv/dap_chain_net_srv_client.c +++ b/modules/net/srv/dap_chain_net_srv_client.c @@ -42,7 +42,7 @@ int dap_chain_net_srv_client_init(dap_chain_net_srv_uid_t a_uid, dap_chain_net_srv_callback_data_t a_callback_response_error, dap_chain_net_srv_callback_data_t a_callback_receipt_next_success, dap_chain_net_srv_callback_data_t a_callback_client_success, - dap_chain_net_srv_callback_data_t a_callback_client_sign_request, + dap_chain_net_srv_callback_sign_request_t a_callback_client_sign_request, void *a_inhertor) { dap_chain_net_srv_t *l_srv_custom = dap_chain_net_srv_get(a_uid); diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index 4673bff67e3f8f40ad79a4e242221446feb59792..c7de7e8f0c988d173597e837c08dffc02c2ad979 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -33,6 +33,7 @@ typedef struct dap_chain_net_srv dap_chain_net_srv_t; typedef void (*dap_chain_net_srv_callback_t)(dap_chain_net_srv_t *, dap_chain_net_srv_client_t *); typedef int (*dap_chain_net_srv_callback_data_t)(dap_chain_net_srv_t *, uint32_t, dap_chain_net_srv_client_t *, const void *, size_t ); +typedef int (*dap_chain_net_srv_callback_sign_request_t)(dap_chain_net_srv_t *, uint32_t, dap_chain_net_srv_client_t *, dap_chain_datum_tx_receipt_t **, size_t ); typedef void (*dap_chain_net_srv_callback_ch_t)(dap_chain_net_srv_t *, dap_stream_ch_t *); typedef struct dap_chain_net_srv @@ -63,7 +64,7 @@ typedef struct dap_chain_net_srv // Client have to start service dap_chain_net_srv_callback_data_t callback_client_success; // Client have to sign receipt - dap_chain_net_srv_callback_data_t callback_client_sign_request; + dap_chain_net_srv_callback_sign_request_t callback_client_sign_request; // Pointer to inheritor object void * _inhertor; @@ -108,5 +109,5 @@ int dap_chain_net_srv_client_init(dap_chain_net_srv_uid_t a_uid, dap_chain_net_srv_callback_data_t a_callback_response_error, dap_chain_net_srv_callback_data_t a_callback_receipt_next_success, dap_chain_net_srv_callback_data_t a_callback_client_success, - dap_chain_net_srv_callback_data_t a_callback_client_sign_request, + dap_chain_net_srv_callback_sign_request_t a_callback_client_sign_request, void *a_inhertor); diff --git a/modules/service/vpn/dap_chain_net_srv_vpn.c b/modules/service/vpn/dap_chain_net_srv_vpn.c index 3ea6b437aa2f5b61d716bce86835b8805de5b666..2605ef012bd46451c4e7c281f0a75946796adb10 100644 --- a/modules/service/vpn/dap_chain_net_srv_vpn.c +++ b/modules/service/vpn/dap_chain_net_srv_vpn.c @@ -147,7 +147,7 @@ static void s_update_limits(dap_stream_ch_t * a_ch , static void m_es_tun_new(dap_events_socket_t * a_es, void * arg); static void m_es_tun_delete(dap_events_socket_t * a_es, void * arg); static void m_es_tun_read(dap_events_socket_t * a_es, void * arg); -static void m_es_tun_error(dap_events_socket_t * a_es, void * arg); +static void m_es_tun_error(dap_events_socket_t * a_es,int arg); pthread_rwlock_t s_tun_sockets_rwlock = PTHREAD_RWLOCK_INITIALIZER; ch_sf_tun_socket_t * s_tun_sockets = NULL; @@ -158,7 +158,8 @@ int s_tun_attach_queue(int fd); dap_events_socket_t * s_tun_event_stream_create(dap_worker_t * a_worker, int a_tun_fd) { assert(a_worker); - static dap_events_socket_callbacks_t l_s_callbacks = {{ 0 }}; + dap_events_socket_callbacks_t l_s_callbacks; + memset(&l_s_callbacks,0,sizeof (l_s_callbacks)); l_s_callbacks.new_callback = m_es_tun_new; l_s_callbacks.read_callback = m_es_tun_read; l_s_callbacks.error_callback = m_es_tun_error; @@ -259,11 +260,11 @@ static int s_callback_client_success(dap_chain_net_srv_t * a_srv, uint32_t a_usa } static int callback_client_sign_request(dap_chain_net_srv_t * a_srv, uint32_t a_usage_id, dap_chain_net_srv_client_t * a_srv_client, - const void **a_receipt, size_t a_receipt_size) + dap_chain_datum_tx_receipt_t **a_receipt, size_t a_receipt_size) { - dap_chain_datum_tx_receipt_t *l_receipt = (dap_chain_datum_tx_receipt_t*)*a_receipt; + dap_chain_datum_tx_receipt_t *l_receipt = *a_receipt; char *l_gdb_group = dap_strdup_printf("local.%s", DAP_CHAIN_NET_SRV_VPN_CDB_GDB_PREFIX); - char *l_wallet_name = dap_chain_global_db_gr_get(dap_strdup("wallet_name"), NULL, l_gdb_group); + char *l_wallet_name = (char*) dap_chain_global_db_gr_get(dap_strdup("wallet_name"), NULL, l_gdb_group); dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_wallet_name, dap_chain_wallet_get_path(g_config)); if(l_wallet) { @@ -1665,7 +1666,7 @@ void m_es_tun_read(dap_events_socket_t * a_es, void * arg) dap_events_socket_set_readable_unsafe(a_es, true); } -void m_es_tun_error(dap_events_socket_t * a_es, void * arg) +void m_es_tun_error(dap_events_socket_t * a_es, int arg) { if (! a_es->_inheritor) return; diff --git a/modules/service/vpn/dap_chain_net_vpn_client_tun.c b/modules/service/vpn/dap_chain_net_vpn_client_tun.c index dd3936e554c566866b0d46dd46ca26f566599948..4c117f905baac62d13705094d8775a3f111f6473 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client_tun.c +++ b/modules/service/vpn/dap_chain_net_vpn_client_tun.c @@ -299,9 +299,9 @@ static void m_client_tun_read(dap_events_socket_t * a_es, void * arg) dap_events_socket_set_readable_unsafe(a_es, true); } -static void m_client_tun_error(dap_events_socket_t * a_es, void * arg) +static void m_client_tun_error(dap_events_socket_t * a_es, int a_arg) { - log_it(L_DEBUG, __PRETTY_FUNCTION__); + log_it(L_WARNING, " TUN client problems: code %d", a_arg); } int dap_chain_net_vpn_client_tun_create(const char *a_ipv4_addr_str, const char *a_ipv4_gw_str) diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index a2250e0abd53ce2b8ac181c44d596ace2e723d9c..60e793599598fdfa84fa2bf3964bf0039e63fe7d 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -56,6 +56,7 @@ typedef struct dap_chain_cs_dag_event_item { dap_chain_hash_fast_t hash; time_t ts_added; dap_chain_cs_dag_event_t *event; + size_t event_size; UT_hash_handle hh; } dap_chain_cs_dag_event_item_t; @@ -78,29 +79,28 @@ typedef struct dap_chain_cs_dag_pvt { #define PVT(a) ((dap_chain_cs_dag_pvt_t *) a->_pvt ) // Atomic element organization callbacks -static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t ); // Accept new event in dag -static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t ); // Verify new event in dag -static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t ); // Get dag event size +static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t , size_t); // Accept new event in dag +static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t , size_t); // Verify new event in dag static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get dag event header size static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain ); -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain , - dap_chain_atom_ptr_t a); +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * , + dap_chain_atom_ptr_t , size_t); static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter , - dap_chain_hash_fast_t * a_atom_hash); + dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chain_t * a_chain , dap_chain_hash_fast_t * a_atom_hash); -static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event); +static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event, size_t a_atom_size); // Get event(s) from dag -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ); // Get the next event from dag -static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_links( dap_chain_atom_iter_t * a_atom_iter , - size_t * a_links_size_ptr ); // Get list of linked events -static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts( dap_chain_atom_iter_t * a_atom_iter , - size_t * a_lasts_size_ptr ); // Get list of linked events +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first( dap_chain_atom_iter_t * a_atom_iter, size_t *a_atom_size ); // Get the fisrt event from dag +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter,size_t *a_atom_size ); // Get the next event from dag +static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_links( dap_chain_atom_iter_t * a_atom_iter , size_t *a_links_size, + size_t ** a_links_size_ptr ); // Get list of linked events +static dap_chain_atom_ptr_t *s_chain_callback_atom_iter_get_lasts( dap_chain_atom_iter_t * a_atom_iter ,size_t *a_links_size, + size_t ** a_lasts_size_ptr ); // Get list of linked events // Delete iterator static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_iter ); // Get the fisrt event from dag @@ -172,7 +172,6 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) // Atom element callbacks a_chain->callback_atom_add = s_chain_callback_atom_add ; // Accept new element in chain a_chain->callback_atom_verify = s_chain_callback_atom_verify ; // Verify new element in chain - a_chain->callback_atom_get_size = s_chain_callback_atom_hdr_get_size; // Get dag event size a_chain->callback_atom_get_hdr_static_size = s_chain_callback_atom_get_static_hdr_size; // Get dag event hdr size a_chain->callback_atom_iter_create = s_chain_callback_atom_iter_create; @@ -248,7 +247,7 @@ void dap_chain_cs_dag_delete(dap_chain_t * a_chain) static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item){ - dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event); + dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size); switch (l_datum->header.type_id) { case DAP_CHAIN_DATUM_TOKEN_DECL: { dap_chain_datum_token_t *l_token = (dap_chain_datum_token_t*) l_datum->data; @@ -265,6 +264,7 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger dap_chain_cs_dag_event_item_t * l_tx_event= DAP_NEW_Z(dap_chain_cs_dag_event_item_t); l_tx_event->ts_added = a_event_item->ts_added; l_tx_event->event = a_event_item->event; + l_tx_event->event_size = a_event_item->event_size; memcpy(&l_tx_event->hash, &a_event_item->hash, sizeof (l_tx_event->hash) ); HASH_ADD(hh,PVT(a_dag)->tx_events,hash,sizeof (l_tx_event->hash),l_tx_event); @@ -282,15 +282,21 @@ static int s_dap_chain_add_atom_to_ledger(dap_chain_cs_dag_t * a_dag, dap_ledger } static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a_ledger, dap_chain_cs_dag_event_item_t * a_event_item ){ - int res = a_dag->callback_cs_verify(a_dag,a_event_item->event); + int res = a_dag->callback_cs_verify(a_dag,a_event_item->event, a_event_item->event_size); if(res == 0){ + char l_buf_hash[128]; + dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1); + log_it(L_DEBUG,"Dag event %s checked, add it to ledger", a_event_item->hash); res = s_dap_chain_add_atom_to_ledger(a_dag, a_ledger, a_event_item); HASH_ADD(hh, PVT(a_dag)->events,hash,sizeof (a_event_item->hash), a_event_item); s_dag_events_lasts_process_new_last_event(a_dag, a_event_item); + }else{ + char l_buf_hash[128]; + dap_chain_hash_fast_to_str(&a_event_item->hash,l_buf_hash,sizeof(l_buf_hash)-1); + log_it(L_WARNING,"Dag event %s check failed: code %d", l_buf_hash, res ); } - return res; } @@ -312,9 +318,10 @@ static bool s_dap_chain_check_if_event_is_present(dap_chain_cs_dag_event_item_t * @brief s_chain_callback_atom_add Accept new event in dag * @param a_chain DAG object * @param a_atom + * @param a_atom_size * @return 0 if verified and added well, otherwise if not */ -static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom) +static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { dap_chain_atom_verify_res_t ret = ATOM_ACCEPT; dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); @@ -323,11 +330,12 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha dap_chain_cs_dag_event_item_t * l_event_item = DAP_NEW_Z(dap_chain_cs_dag_event_item_t); pthread_rwlock_t * l_events_rwlock = &PVT(l_dag)->events_rwlock ; l_event_item->event = l_event; + l_event_item->event_size = a_atom_size; l_event_item->ts_added = time(NULL); - dap_hash_fast(l_event, dap_chain_cs_dag_event_calc_size(l_event),&l_event_item->hash ); + dap_hash_fast(l_event, a_atom_size,&l_event_item->hash ); dap_chain_hash_fast_t l_event_hash; - dap_chain_cs_dag_event_calc_hash(l_event,&l_event_hash); + dap_chain_cs_dag_event_calc_hash(l_event, a_atom_size,&l_event_hash); char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_item->hash); log_it(L_DEBUG, "Processing event: %s...", l_event_hash_str); @@ -344,8 +352,10 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha } // verify hashes and consensus - if(ret == ATOM_ACCEPT) - ret = s_chain_callback_atom_verify (a_chain, a_atom); + if(ret == ATOM_ACCEPT){ + ret = s_chain_callback_atom_verify (a_chain, a_atom, a_atom_size); + log_it(L_DEBUG, "Accepted atom %p", a_atom); + } if( ret == ATOM_MOVE_TO_THRESHOLD){ HASH_ADD(hh, PVT(l_dag)->events_treshold,hash,sizeof (l_event_item->hash), l_event_item); @@ -427,7 +437,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain int l_index = rand() % (int) l_events_round_new_size; dap_chain_hash_fast_t l_hash; dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) l_events_round_new[l_index].value; - size_t l_event_size = dap_chain_cs_dag_event_calc_size(l_event); + size_t l_event_size = l_events_round_new[l_index].value_len; dap_hash_fast(l_event, l_event_size,&l_hash); bool l_is_already_in_event = false; @@ -468,12 +478,13 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain if (l_hashes_linked || s_seed_mode ) { dap_chain_cs_dag_event_t * l_event = NULL; + size_t l_event_size = 0; if(l_dag->callback_cs_event_create) - l_event = l_dag->callback_cs_event_create(l_dag,l_datum,l_hashes,l_hashes_linked); - if ( l_event){ // Event is created + l_event = l_dag->callback_cs_event_create(l_dag,l_datum,l_hashes,l_hashes_linked,&l_event_size); + if ( l_event&&l_event_size){ // Event is created if (l_dag->is_add_directy) { - if (s_chain_callback_atom_add(a_chain, l_event) == ATOM_ACCEPT) { + if (s_chain_callback_atom_add(a_chain, l_event, l_event_size) == ATOM_ACCEPT) { // add events to file if (!l_cell) { l_cell = dap_chain_cell_create(); @@ -486,7 +497,7 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain l_cell->id.uint64 = l_net ? l_net->pub.cell_id.uint64 : 0; l_cell->file_storage_path = dap_strdup_printf("%0llx.dchaincell", l_cell->id.uint64); } - if (dap_chain_cell_file_append(l_cell, l_event, a_chain->callback_atom_get_size(l_event)) < 0) { + if (dap_chain_cell_file_append(l_cell, l_event, l_event_size ) < 0) { log_it(L_ERROR, "Can't add new event to the file '%s'", l_cell->file_storage_path); continue; } @@ -500,10 +511,10 @@ static size_t s_chain_callback_datums_pool_proc(dap_chain_t * a_chain, dap_chain // add to new round into global_db else { dap_chain_hash_fast_t l_event_hash; - dap_chain_cs_dag_event_calc_hash(l_event, &l_event_hash); + dap_chain_cs_dag_event_calc_hash(l_event,l_event_size, &l_event_hash); char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash); if(dap_chain_global_db_gr_set(dap_strdup(l_event_hash_str), (uint8_t *) l_event, - dap_chain_cs_dag_event_calc_size(l_event), + l_event_size, l_dag->gdb_group_events_round_new)) { log_it(L_INFO, "Event %s placed in the new forming round", l_event_hash_str); DAP_DELETE(l_event_hash_str); @@ -570,12 +581,14 @@ dap_chain_cs_dag_event_t* dap_chain_cs_dag_find_event_by_hash(dap_chain_cs_dag_t * @param a_atom * @return */ -static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom) +static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t a_atom,size_t a_atom_size) { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain); dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *) a_atom; dap_chain_atom_verify_res_t res = ATOM_ACCEPT; + if(sizeof (l_event->header)<= a_atom_size) + return ATOM_REJECT; // genesis or seed mode if (l_event->header.hash_count == 0){ if(s_seed_mode && !PVT(l_dag)->events) @@ -583,7 +596,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ if (l_dag->is_static_genesis_event ){ dap_chain_hash_fast_t l_event_hash; - dap_chain_cs_dag_event_calc_hash(l_event,&l_event_hash); + dap_chain_cs_dag_event_calc_hash(l_event,a_atom_size, &l_event_hash); if ( memcmp( &l_event_hash, &l_dag->static_genesis_event_hash, sizeof(l_event_hash) ) != 0 ){ char * l_event_hash_str = dap_chain_hash_fast_to_str_new(&l_event_hash); char * l_genesis_event_hash_str = dap_chain_hash_fast_to_str_new(&l_dag->static_genesis_event_hash); @@ -618,7 +631,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_ //consensus if(res == ATOM_ACCEPT) - if(l_dag->callback_cs_verify ( l_dag, l_event )) + if(l_dag->callback_cs_verify ( l_dag, l_event,a_atom_size )) res = ATOM_REJECT; return res; @@ -661,7 +674,7 @@ void s_dag_events_lasts_process_new_last_event(dap_chain_cs_dag_t * a_dag, dap_c dap_chain_cs_dag_event_item_t * l_event_last= DAP_NEW_Z(dap_chain_cs_dag_event_item_t); l_event_last->ts_added = a_event_item->ts_added; l_event_last->event = a_event_item->event; - dap_hash_fast(l_event_last->event, dap_chain_cs_dag_event_calc_size(l_event_last->event),&l_event_last->hash ); + dap_hash_fast(l_event_last->event, a_event_item->event_size,&l_event_last->hash ); HASH_ADD(hh,PVT(a_dag)->events_lasts_unlinked,hash, sizeof(l_event_last->hash),l_event_last); } @@ -749,17 +762,6 @@ bool dap_chain_cs_dag_proc_treshold(dap_chain_cs_dag_t * a_dag, dap_ledger_t * a return res; } - -/** - * @brief s_chain_callback_atom_get_size Get size of atomic element - * @param a_atom - * @return - */ -static size_t s_chain_callback_atom_hdr_get_size(dap_chain_atom_ptr_t a_atom) -{ - return dap_chain_cs_dag_event_calc_size( (dap_chain_cs_dag_event_t * ) a_atom); -} - /** * @brief s_chain_callback_atom_get_static_hdr_size * @param a_chain @@ -777,7 +779,7 @@ static size_t s_chain_callback_atom_get_static_hdr_size() * @return */ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain , - dap_chain_atom_ptr_t a_atom) + dap_chain_atom_ptr_t a_atom, size_t a_atom_size) { dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_atom_iter->chain = a_chain; @@ -785,7 +787,7 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t if ( a_atom ){ dap_chain_hash_fast_t l_atom_hash; - dap_hash_fast(a_atom, a_chain->callback_atom_get_size(a_atom), &l_atom_hash ); + dap_hash_fast(a_atom, a_atom_size, &l_atom_hash ); dap_chain_cs_dag_event_item_t * l_atom_item; HASH_FIND(hh, PVT(DAP_CHAIN_CS_DAG(a_chain))->events, &l_atom_hash, sizeof(l_atom_hash),l_atom_item ); @@ -812,10 +814,10 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_ * @param a_atom_iter * @return */ -static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event) +static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a_event, size_t a_atom_size) { if(a_event) - return dap_chain_cs_dag_event_get_datum((dap_chain_cs_dag_event_t*) a_event); + return dap_chain_cs_dag_event_get_datum((dap_chain_cs_dag_event_t*) a_event, a_atom_size); return NULL; } @@ -824,16 +826,19 @@ static dap_chain_datum_t* s_chain_callback_atom_get_datum(dap_chain_atom_ptr_t a * @param a_atom_iter * @return */ -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter ) +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_iter_t * a_atom_iter, size_t * a_ret_size ) { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_atom_iter->chain); dap_chain_cs_dag_pvt_t *l_dag_pvt = l_dag ? PVT(l_dag) : NULL; a_atom_iter->cur_item = l_dag_pvt->events; a_atom_iter->cur = (dap_chain_cs_dag_event_t*) (l_dag_pvt->events ? l_dag_pvt->events->event : NULL); + a_atom_iter->cur_size =l_dag_pvt->events->event_size; // a_atom_iter->cur = a_atom_iter->cur ? // (dap_chain_cs_dag_event_t*) PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events->event : NULL; // a_atom_iter->cur_item = PVT (DAP_CHAIN_CS_DAG( a_atom_iter->chain) )->events; + if (a_ret_size) + *a_ret_size = a_atom_iter->cur_size; return a_atom_iter->cur; } @@ -843,21 +848,24 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ * @param a_lasts_size_ptr * @return */ -static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts( dap_chain_atom_iter_t * a_atom_iter , - size_t * a_lasts_size_ptr ) +static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts( dap_chain_atom_iter_t * a_atom_iter ,size_t * a_lasts_size, + size_t ** a_lasts_size_array ) { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain ); - *a_lasts_size_ptr = HASH_COUNT( PVT(l_dag)->events_lasts_unlinked ); - if ( *a_lasts_size_ptr > 0 ) { + if ( HASH_COUNT( PVT(l_dag)->events_lasts_unlinked ) > 0 ) { + if( a_lasts_size) + *a_lasts_size = HASH_COUNT( PVT(l_dag)->events_lasts_unlinked ); dap_chain_atom_ptr_t * l_ret = DAP_NEW_Z_SIZE( dap_chain_atom_ptr_t, - sizeof (dap_chain_atom_ptr_t*) * (*a_lasts_size_ptr) ); + sizeof (dap_chain_atom_ptr_t*) * HASH_COUNT( PVT(l_dag)->events_lasts_unlinked ) ); dap_chain_cs_dag_event_item_t * l_event_item = NULL, *l_event_item_tmp = NULL; size_t i = 0; pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); + *a_lasts_size_array = DAP_NEW_Z_SIZE(size_t,sizeof (size_t)* HASH_CNT(hh,PVT(l_dag)->events_lasts_unlinked)); HASH_ITER(hh,PVT(l_dag)->events_lasts_unlinked, l_event_item,l_event_item_tmp){ l_ret[i] = l_event_item->event; + (*a_lasts_size_array)[i] = l_event_item->event_size; i++; } pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); @@ -872,8 +880,8 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_lasts( dap_chain_ato * @param a_links_size_ptr * @return */ -static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_atom_iter_t * a_atom_iter , - size_t * a_links_size_ptr ) +static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_atom_iter_t * a_atom_iter ,size_t* a_links_size, + size_t ** a_links_size_array ) { if ( a_atom_iter->cur && a_atom_iter->chain){ dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain ); @@ -886,7 +894,9 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_ato if ( l_event->header.hash_count > 0){ dap_chain_atom_ptr_t * l_ret = DAP_NEW_Z_SIZE(dap_chain_atom_ptr_t, sizeof (dap_chain_atom_ptr_t*) * l_event->header.hash_count ); - *a_links_size_ptr = l_event->header.hash_count; + if( a_links_size) + *a_links_size = l_event->header.hash_count; + *a_links_size_array = DAP_NEW_Z_SIZE(size_t, l_event->header.hash_count*sizeof (size_t)); for (uint16_t i = 0; i < l_event->header.hash_count; i++){ dap_chain_cs_dag_event_item_t * l_link_item = NULL; dap_chain_hash_fast_t * l_link_hash = (dap_chain_hash_fast_t *) @@ -895,16 +905,17 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_ato HASH_FIND(hh, PVT(l_dag)->events,l_link_hash,sizeof(*l_link_hash),l_link_item); if ( l_link_item ){ l_ret[i] = l_link_item->event; + (*a_links_size_array)[i] = l_link_item->event_size; }else { char * l_link_hash_str = dap_chain_hash_fast_to_str_new(l_link_hash); char * l_event_hash_str = l_event_item ? dap_chain_hash_fast_to_str_new(&l_event_item->hash) : NULL; log_it(L_ERROR,"Can't find %s->%s links", l_event_hash_str ? l_event_hash_str : "[null]", l_link_hash_str); DAP_DELETE(l_event_hash_str); DAP_DELETE(l_link_hash_str); - (*a_links_size_ptr)--; + (*a_links_size_array)--; } } - if(!(*a_links_size_ptr)){ + if(!(*a_links_size_array)){ DAP_DELETE(l_ret); l_ret = NULL; } @@ -921,7 +932,7 @@ static dap_chain_atom_ptr_t* s_chain_callback_atom_iter_get_links( dap_chain_ato * @return */ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_atom_iter_t * a_atom_iter , - dap_chain_hash_fast_t * a_atom_hash) + dap_chain_hash_fast_t * a_atom_hash,size_t *a_atom_size) { dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG( a_atom_iter->chain ); dap_chain_cs_dag_event_item_t * l_event_item = NULL; @@ -929,6 +940,9 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_find_by_hash(dap_chain_at if ( l_event_item ){ a_atom_iter->cur_item = l_event_item; a_atom_iter->cur = l_event_item->event; + a_atom_iter->cur_size= l_event_item->event_size; + if(a_atom_size) + *a_atom_size = l_event_item->event_size; return l_event_item->event; }else return NULL; @@ -942,7 +956,7 @@ static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chai dap_chain_cs_dag_event_item_t * l_event_item = NULL; HASH_FIND(hh, PVT(l_dag)->tx_events,a_atom_hash,sizeof(*a_atom_hash),l_event_item); if ( l_event_item ){ - dap_chain_datum_t * l_datum = dap_chain_cs_dag_event_get_datum(l_event_item->event) ; + dap_chain_datum_t * l_datum = dap_chain_cs_dag_event_get_datum(l_event_item->event, l_event_item->event_size) ; return l_datum ? l_datum->header.data_size ? (dap_chain_datum_tx_t*) l_datum->data : NULL :NULL; }else return NULL; @@ -953,7 +967,7 @@ static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chai * @param a_atom_iter * @return */ -static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter ) +static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter,size_t * a_atom_size ) { if (a_atom_iter->cur ){ dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; @@ -962,6 +976,10 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_ // if l_event_item=NULL then items are over a_atom_iter->cur = l_event_item ? l_event_item->event : NULL; } + a_atom_iter->cur_size = a_atom_iter->cur?a_atom_iter->cur_size: 0; + if(a_atom_size) + *a_atom_size = a_atom_iter->cur_size; + return a_atom_iter->cur; } @@ -984,6 +1002,7 @@ static void s_chain_callback_atom_iter_delete(dap_chain_atom_iter_t * a_atom_ite */ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) { + (void) arg_func; enum { SUBCMD_EVENT_CREATE, SUBCMD_EVENT_CANCEL, @@ -992,13 +1011,13 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) SUBCMD_UNDEFINED } l_event_subcmd={0}; - const char* l_event_subcmd_str[]={ + /*const char* l_event_subcmd_str[]={ [SUBCMD_EVENT_CREATE]="create", [SUBCMD_EVENT_CANCEL]="cancel", [SUBCMD_EVENT_LIST]="list", [SUBCMD_EVENT_DUMP]="dump", [SUBCMD_UNDEFINED]="UNDEFINED" - }; + };*/ int arg_index = 1; @@ -1082,7 +1101,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t*) l_objs[i].value; size_t l_event_size = l_objs[i].value_len; int l_ret_event_verify; - if ( ( l_ret_event_verify = l_dag->callback_cs_verify (l_dag,l_event) ) !=0 ){// if consensus accept the event + if ( ( l_ret_event_verify = l_dag->callback_cs_verify (l_dag,l_event,l_event_size) ) !=0 ){// if consensus accept the event dap_string_append_printf( l_str_ret_tmp, "Error! Event %s is not passing consensus verification, ret code %d\n", l_objs[i].key, l_ret_event_verify ); @@ -1092,9 +1111,9 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) dap_string_append_printf( l_str_ret_tmp, "Event %s verification passed\n", l_objs[i].key); // If not verify only mode we add if ( ! l_verify_only ){ - dap_chain_atom_ptr_t l_new_atom = (dap_chain_atom_ptr_t)dap_chain_cs_dag_event_copy(l_event); // produce deep copy of event; + dap_chain_atom_ptr_t l_new_atom = (dap_chain_atom_ptr_t)dap_chain_cs_dag_event_copy(l_event, l_event_size); // produce deep copy of event; memcpy(l_new_atom, l_event, l_event_size); - if(s_chain_callback_atom_add(l_chain, l_new_atom) < 0) { // Add new atom in chain + if(s_chain_callback_atom_add(l_chain, l_new_atom,l_event_size) < 0) { // Add new atom in chain DAP_DELETE(l_new_atom); dap_string_append_printf(l_str_ret_tmp, "Event %s not added in chain\n", l_objs[i].key); } @@ -1297,7 +1316,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) }else if ( strcmp(l_from_events_str,"events_lasts") == 0){ dap_chain_cs_dag_event_item_t * l_event_item = NULL; - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); + pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); HASH_FIND(hh,PVT(l_dag)->events_lasts_unlinked,&l_event_hash,sizeof(l_event_hash),l_event_item); pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); if ( l_event_item ) @@ -1310,7 +1329,7 @@ static int s_cli_dag(int argc, char ** argv, void *arg_func, char **a_str_reply) } }else if ( strcmp(l_from_events_str,"events") == 0){ dap_chain_cs_dag_event_item_t * l_event_item = NULL; - pthread_rwlock_wrlock(&PVT(l_dag)->events_rwlock); + pthread_rwlock_rdlock(&PVT(l_dag)->events_rwlock); HASH_FIND(hh,PVT(l_dag)->events,&l_event_hash,sizeof(l_event_hash),l_event_item); pthread_rwlock_unlock(&PVT(l_dag)->events_rwlock); if ( l_event_item ) diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index edf2b6621705cece4659efc2ddae1e91063a979d..a9d1d755b57b6591a1c395fe59d05aeebc0c3e34 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -45,8 +45,9 @@ */ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum ,dap_enc_key_t * a_key , - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count) + dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t * a_event_size) { + assert(a_event_size); size_t l_hashes_size = sizeof(*a_hashes)*a_hashes_count; size_t l_datum_size = dap_chain_datum_size(a_datum); dap_chain_cs_dag_event_t * l_event_new = NULL; @@ -58,11 +59,15 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, l_event_new->header.cell_id.uint64 = a_cell_id.uint64; l_event_new->header.chain_id.uint64 = a_chain_id.uint64; l_event_new->header.hash_count = a_hashes_count; + *a_event_size = sizeof (l_event_new->header); - if ( l_hashes_size ) + if ( l_hashes_size ){ memcpy(l_event_new->hashes_n_datum_n_signs, a_hashes, l_hashes_size ); + *a_event_size += l_hashes_size; + } memcpy(l_event_new->hashes_n_datum_n_signs+l_hashes_size, a_datum,l_datum_size ); + *a_event_size += l_datum_size; if ( a_key ){ dap_sign_t * l_sign = dap_sign_create(a_key,l_event_new, @@ -72,6 +77,7 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, size_t l_sign_size = dap_sign_get_size(l_sign); l_event_new = (dap_chain_cs_dag_event_t* )DAP_REALLOC(l_event_new,l_event_size+l_sign_size ); memcpy(l_event_new->hashes_n_datum_n_signs + l_hashes_size + l_datum_size, l_sign, l_sign_size); + *a_event_size += l_sign_size; l_event_size += l_sign_size; l_event_new->header.signs_count++; DAP_DELETE(l_sign); @@ -91,13 +97,12 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, * @param a_event_src * @return */ -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src) +dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src,size_t a_event_size) { if(!a_event_src) return NULL; - size_t l_event_size = dap_chain_cs_dag_event_calc_size(a_event_src); - dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, l_event_size); - memcpy(l_event_new, a_event_src, l_event_size); + dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, a_event_size); + memcpy(l_event_new, a_event_src, a_event_size); return l_event_new; } @@ -107,16 +112,15 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t * @param l_key * @return */ -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event, +dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, dap_enc_key_t * l_key) { - size_t l_event_size = dap_chain_cs_dag_event_calc_size( a_event ); - size_t l_event_signing_size = dap_chain_cs_dag_event_calc_size_excl_signs( a_event ); + size_t l_event_signing_size = dap_chain_cs_dag_event_calc_size_excl_signs( a_event ,a_event_size); dap_sign_t * l_sign = dap_sign_create(l_key,a_event,l_event_signing_size,0); size_t l_sign_size = dap_sign_get_size(l_sign); - dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, l_event_size+l_sign_size); - memcpy(l_event_new, a_event,l_event_size); - memcpy(l_event_new+l_event_size,l_sign,l_sign_size); + dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, a_event_size+l_sign_size); + memcpy(l_event_new, a_event,a_event_size); + memcpy(l_event_new+a_event_size,l_sign,l_sign_size); l_event_new->header.signs_count++; return l_event_new; } @@ -127,16 +131,23 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_ * @param a_sign_number * @return */ -dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, uint16_t a_sign_number) +dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, uint16_t a_sign_number) { + size_t l_offset_passed = sizeof (a_event->header); if (a_event->header.signs_count > a_sign_number ){ - size_t l_offset_to_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_event); + size_t l_offset_to_sign = dap_chain_cs_dag_event_calc_size_excl_signs(a_event,a_event_size); + l_offset_passed += l_offset_to_sign; + if ( l_offset_passed >= a_event_size) + return NULL; uint8_t * l_signs = ((uint8_t*) a_event)+l_offset_to_sign; uint16_t l_signs_offset = 0; uint16_t l_signs_passed; for ( l_signs_passed=0; l_signs_passed < a_sign_number; l_signs_passed++){ dap_sign_t * l_sign = (dap_sign_t *) (l_signs+l_signs_offset); l_signs_offset+=l_sign->header.sign_pkey_size+l_sign->header.sign_size+sizeof(l_sign->header); + l_offset_passed += l_offset_to_sign; + if ( l_offset_passed >= a_event_size) + return NULL; } return (dap_sign_t*) l_signs + l_signs_offset; }else diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h index 74a974b5a6d1a568c0cb1915da15f52cc3798144..6befe38ae351a1f4d04298ef2a8b8f588ca3a3de 100644 --- a/modules/type/dag/include/dap_chain_cs_dag.h +++ b/modules/type/dag/include/dap_chain_cs_dag.h @@ -28,14 +28,14 @@ typedef struct dap_chain_cs_dag dap_chain_cs_dag_t; typedef void (*dap_chain_cs_dag_callback_t)(dap_chain_cs_dag_t *); -typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *); +typedef int (*dap_chain_cs_dag_callback_event_t)(dap_chain_cs_dag_t *, dap_chain_cs_dag_event_t *,size_t); typedef dap_chain_cs_dag_event_t * (*dap_chain_cs_dag_callback_event_create_t)(dap_chain_cs_dag_t *, dap_chain_datum_t *, dap_chain_hash_fast_t *, - size_t); + size_t, size_t*); typedef struct dap_chain_cs_dag { diff --git a/modules/type/dag/include/dap_chain_cs_dag_event.h b/modules/type/dag/include/dap_chain_cs_dag_event.h index 39b898d9b1e9123e8ed62b068287a85a0c31d3e6..14e2d7850659cd50a81d7af39338f3111e9a4ba9 100644 --- a/modules/type/dag/include/dap_chain_cs_dag_event.h +++ b/modules/type/dag/include/dap_chain_cs_dag_event.h @@ -49,7 +49,7 @@ typedef struct dap_chain_cs_dag_event { dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t * a_datum, dap_enc_key_t * a_key, - dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count); + dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t * a_event_size); /** @@ -57,23 +57,25 @@ dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, * @param a_event * @return */ -static inline dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event) +static inline dap_chain_datum_t* dap_chain_cs_dag_event_get_datum(dap_chain_cs_dag_event_t * a_event,size_t a_event_size) { - return (dap_chain_datum_t* ) (a_event->hashes_n_datum_n_signs - +a_event->header.hash_count*sizeof(dap_chain_hash_fast_t)); + return a_event->header.hash_count*sizeof(dap_chain_hash_fast_t)<=a_event_size?(dap_chain_datum_t* ) (a_event->hashes_n_datum_n_signs + +a_event->header.hash_count*sizeof(dap_chain_hash_fast_t)): NULL; } -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src); +dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy(dap_chain_cs_dag_event_t *a_event_src, size_t a_event_size); // Important: returns new deep copy of event -dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event, dap_enc_key_t * l_key); -dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, uint16_t a_sign_number); +dap_chain_cs_dag_event_t * dap_chain_cs_dag_event_copy_with_sign_add( dap_chain_cs_dag_event_t * a_event,size_t a_event_size, dap_enc_key_t * l_key); +dap_sign_t * dap_chain_cs_dag_event_get_sign( dap_chain_cs_dag_event_t * a_event, size_t a_event_size, uint16_t a_sign_number); /** * @brief dap_chain_cs_dag_event_calc_size * @param a_event * @return */ + +/** static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * a_event) { if(!a_event) @@ -93,14 +95,16 @@ static inline size_t dap_chain_cs_dag_event_calc_size(dap_chain_cs_dag_event_t * return sizeof( a_event->header ) + l_hashes_size +l_signs_offset +l_datum_size; } - +**/ /** * @brief dap_chain_cs_dag_event_calc_size_excl_signs * @param a_event * @return */ -static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event) +static inline ssize_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_dag_event_t * a_event,size_t a_event_size) { + if (a_event_size> sizeof (a_event->header)) + return -1; size_t l_hashes_size = a_event->header.hash_count*sizeof(dap_chain_hash_fast_t); dap_chain_datum_t * l_datum = (dap_chain_datum_t*) (a_event->hashes_n_datum_n_signs + l_hashes_size); size_t l_datum_size = dap_chain_datum_size(l_datum); @@ -113,7 +117,7 @@ static inline size_t dap_chain_cs_dag_event_calc_size_excl_signs(dap_chain_cs_da * @param a_event * @param a_event_hash */ -static inline void dap_chain_cs_dag_event_calc_hash(dap_chain_cs_dag_event_t * a_event,dap_chain_hash_fast_t * a_event_hash) +static inline void dap_chain_cs_dag_event_calc_hash(dap_chain_cs_dag_event_t * a_event,size_t a_event_size, dap_chain_hash_fast_t * a_event_hash) { - dap_hash_fast(a_event, dap_chain_cs_dag_event_calc_size (a_event) , a_event_hash); + dap_hash_fast(a_event, a_event_size , a_event_hash); }