diff --git a/dap-sdk/core/include/dap_common.h b/dap-sdk/core/include/dap_common.h index 1b8b665af8f52b5959292e0816ecae2c994f5f01..b09f0098434434c62194f3ae3b758d09fde7d003 100755 --- a/dap-sdk/core/include/dap_common.h +++ b/dap-sdk/core/include/dap_common.h @@ -123,6 +123,7 @@ typedef uint8_t byte_t; #define DAP_REALLOC(a, b) rprealloc(a,b) #define DAP_DELETE(a) rpfree(a) #define DAP_DUP(a) memcpy(rpmalloc(sizeof(*a)), a, sizeof(*a)) + #define DAP_DUP_SIZE(a, s) memcpy(rpmalloc(s), a, s) #else #define DAP_MALLOC(a) malloc(a) #define DAP_FREE(a) free(a) @@ -139,6 +140,7 @@ typedef uint8_t byte_t; #define DAP_REALLOC(a, b) realloc(a,b) #define DAP_DELETE(a) free(a) #define DAP_DUP(a) memcpy(malloc(sizeof(*a)), a, sizeof(*a)) + #define DAP_DUP_SIZE(a, s) memcpy(malloc(s), a, s) #endif #define DAP_DEL_Z(a) if(a) { DAP_DELETE(a); a=NULL;} diff --git a/dap-sdk/net/core/dap_events_socket.c b/dap-sdk/net/core/dap_events_socket.c index d3c11a8f20604c1bc3c2f1123777e6c227f81fee..0f669463b7dd1d43f2f6036f34b0e53b3392b6ea 100644 --- a/dap-sdk/net/core/dap_events_socket.c +++ b/dap-sdk/net/core/dap_events_socket.c @@ -2107,10 +2107,18 @@ size_t dap_events_socket_write_f_mt(dap_worker_t * a_w,dap_events_socket_uuid_t */ size_t dap_events_socket_write_unsafe(dap_events_socket_t *a_es, const void * a_data, size_t a_data_size) { - if(a_es->buf_out_size > a_es->buf_out_size_max){ - log_it(L_DEBUG,"write buffer already overflow size=%u/max=%u", a_es->buf_out_size, a_es->buf_out_size_max); - return 0; - } + if (a_es->buf_out_size + a_data_size > a_es->buf_out_size_max) { + if (a_es->buf_out_size_max + a_data_size > DAP_EVENTS_SOCKET_BUF_LIMIT) { + log_it(L_ERROR, "Write esocket buffer overflow size=%u/max=%u", a_es->buf_out_size_max, DAP_EVENTS_SOCKET_BUF_LIMIT); + return 0; + } else { + size_t l_new_size = a_es->buf_out_size_max * 2; + if (l_new_size > DAP_EVENTS_SOCKET_BUF_LIMIT) + l_new_size = DAP_EVENTS_SOCKET_BUF_LIMIT; + a_es->buf_out = DAP_REALLOC(a_es->buf_out, l_new_size); + a_es->buf_out_size_max = l_new_size; + } + } a_data_size = (a_es->buf_out_size + a_data_size < a_es->buf_out_size_max) ? a_data_size : (a_es->buf_out_size_max - a_es->buf_out_size); memcpy(a_es->buf_out + a_es->buf_out_size, a_data, a_data_size); a_es->buf_out_size += a_data_size; diff --git a/dap-sdk/net/core/dap_worker.c b/dap-sdk/net/core/dap_worker.c index a5e90d5a9268b4b354a09cf5e9fe7ed3b7ef26d7..9d706da25f9151b2e1d2a34499a12043e4d96133 100644 --- a/dap-sdk/net/core/dap_worker.c +++ b/dap-sdk/net/core/dap_worker.c @@ -1079,9 +1079,8 @@ static void s_queue_es_io_callback( dap_events_socket_t * a_es, void * a_arg) dap_events_socket_set_writable_unsafe(l_msg_es, true); if (l_msg->flags_unset & DAP_SOCK_READY_TO_WRITE) dap_events_socket_set_writable_unsafe(l_msg_es, false); - if (l_msg->data_size && l_msg->data) + if (l_msg->data_size && l_msg->data) { dap_events_socket_write_unsafe(l_msg_es, l_msg->data,l_msg->data_size); - if (l_msg->data) { DAP_DELETE(l_msg->data); } DAP_DELETE(l_msg); diff --git a/dap-sdk/net/core/include/dap_events_socket.h b/dap-sdk/net/core/include/dap_events_socket.h index e7463c46cb389a2b737f296e40ce60c5030180b3..b1b641a0c2b4ecc221392b3678df00968c22fdd9 100644 --- a/dap-sdk/net/core/include/dap_events_socket.h +++ b/dap-sdk/net/core/include/dap_events_socket.h @@ -142,8 +142,9 @@ typedef struct dap_events_socket_callbacks { } dap_events_socket_callbacks_t; -#define DAP_EVENTS_SOCKET_BUF 100000 -#define DAP_QUEUE_MAX_MSGS 8 +#define DAP_EVENTS_SOCKET_BUF 100000 +#define DAP_EVENTS_SOCKET_BUF_LIMIT 500000 +#define DAP_QUEUE_MAX_MSGS 8 typedef enum { DESCRIPTOR_TYPE_SOCKET_CLIENT = 0, diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c index c5d030a77e882e205025a9ed5c44f6688f14d157..21ec647c43d65401b09ccbb72798e9023827071a 100644 --- a/dap-sdk/net/stream/stream/dap_stream.c +++ b/dap-sdk/net/stream/stream/dap_stream.c @@ -757,11 +757,17 @@ static void s_stream_proc_pkt_in(dap_stream_t * a_stream) case STREAM_PKT_TYPE_DATA_PACKET: { dap_stream_ch_pkt_t * l_ch_pkt = (dap_stream_ch_pkt_t *) a_stream->pkt_cache; - if(dap_stream_pkt_read_unsafe(a_stream,l_pkt, l_ch_pkt, sizeof(a_stream->pkt_cache))==0){ + size_t l_dec_pkt_size = dap_stream_pkt_read_unsafe(a_stream, l_pkt, l_ch_pkt, sizeof(a_stream->pkt_cache)); + if (l_dec_pkt_size == 0) { log_it(L_WARNING, "Input: can't decode packet size=%d",l_pkt_size); DAP_DELETE(l_pkt); return; } + if (l_dec_pkt_size != l_ch_pkt->hdr.size + sizeof(l_ch_pkt->hdr)) { + log_it(L_WARNING, "Input: decoded packet has bad size = %d, decoded size = %d", l_ch_pkt->hdr.size, l_dec_pkt_size); + DAP_DELETE(l_pkt); + return; + } s_detect_loose_packet(a_stream); diff --git a/dap-sdk/net/stream/stream/dap_stream_worker.c b/dap-sdk/net/stream/stream/dap_stream_worker.c index ae002f36e3b92199788ee659fb0c99f92b06903c..45ab6fc06562ab209da29c3e69abc0d31ba0a486 100644 --- a/dap-sdk/net/stream/stream/dap_stream_worker.c +++ b/dap-sdk/net/stream/stream/dap_stream_worker.c @@ -119,8 +119,10 @@ static void s_ch_io_callback(dap_events_socket_t * a_es, void * a_msg) dap_stream_ch_set_ready_to_write_unsafe(l_msg_ch, true); if (l_msg->flags_unset & DAP_SOCK_READY_TO_WRITE) dap_stream_ch_set_ready_to_write_unsafe(l_msg_ch, false); - if (l_msg->data_size && l_msg->data) + if (l_msg->data_size && l_msg->data) { dap_stream_ch_pkt_write_unsafe(l_msg_ch, l_msg->ch_pkt_type, l_msg->data,l_msg->data_size); + DAP_DELETE(l_msg->data); + } DAP_DELETE(l_msg); } diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 702a5a9744ede55801fcb39832131e2efc3ec7b3..4bea5bc0e3bae612363c5f92a2a9288e3a387f8e 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -950,6 +950,8 @@ void dap_chain_ledger_load_cache(dap_ledger_t *a_ledger) l_objs_count = 0; l_objs = dap_chain_global_db_gr_load(l_gdb_group, &l_objs_count); for (size_t i = 0; i < l_objs_count; i++) { + if (!l_objs[i].value_len) + continue; dap_chain_ledger_token_emission_item_t *l_emission_item = DAP_NEW_Z(dap_chain_ledger_token_emission_item_t); dap_chain_hash_fast_from_str(l_objs[i].key, &l_emission_item->datum_token_emission_hash); l_emission_item->datum_token_emission = DAP_NEW_Z_SIZE(dap_chain_datum_token_emission_t, l_objs[i].value_len); diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index 0b003381dd0161a9ed212c34df67352fec1a7d94..51d4da3c79997b7a9ba0c9256f2dee97dcfeef4e 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -283,6 +283,7 @@ static bool s_grace_period_control(dap_chain_net_srv_grace_t *a_grace) // TODO extend callback to pass ext and ext size from service callbacks l_receipt = dap_chain_net_srv_issue_receipt( l_usage->service, l_usage, l_usage->price,NULL,0 ); dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_SIGN_REQUEST, l_receipt, l_receipt->size); + DAP_DELETE(l_receipt); }else{ l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_PRICE_NOT_FOUND ; goto free_exit; diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index a7eb706602d71274638808b76e3acd832dc4175f..749d9e796981a180edaae6d8ddea9a78bf2634e0 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -471,8 +471,8 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) if (!l_chain) { if (s_debug_more) log_it(L_WARNING, "No chain found for DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN"); - DAP_DELETE(l_sync_request); DAP_DEL_Z(l_pkt_item->pkt_data); + DAP_DELETE(l_sync_request); return true; } dap_chain_atom_ptr_t l_atom_copy = (dap_chain_atom_ptr_t)l_pkt_item->pkt_data; @@ -498,6 +498,7 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) dap_chain_hash_fast_to_str(&l_atom_hash,l_atom_hash_str,sizeof (l_atom_hash_str)-1 ); log_it(L_WARNING,"Atom with hash %s for %s:%s not accepted (code ATOM_PASS, already present)", l_atom_hash_str, l_chain->net_name, l_chain->name); } + dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); DAP_DELETE(l_atom_copy); break; case ATOM_MOVE_TO_THRESHOLD: @@ -538,6 +539,8 @@ static bool s_sync_in_chains_callback(dap_proc_thread_t *a_thread, void *a_arg) if(l_res < 0) { log_it(L_ERROR, "Can't save event 0x%x from treshold to file '%s'", l_atom_treshold, l_cell ? l_cell->file_storage_path : "[null]"); + } else { + dap_db_set_last_hash_remote(l_sync_request->request.node_addr.uint64, l_chain, &l_atom_hash); } } } while(l_atom_treshold); @@ -699,7 +702,7 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) } } // save data to global_db - if(!dap_chain_global_db_obj_save(l_obj, 1)) { + if(!dap_chain_global_db_obj_save(dap_store_obj_copy(l_obj, 1), 1)) { struct sync_request *l_sync_req_err = DAP_DUP(l_sync_request); dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_gdb_in_pkt_error_worker_callback, l_sync_req_err); @@ -808,7 +811,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ:{ if(l_ch_chain->state != CHAIN_STATE_IDLE){ log_it(L_WARNING, "Can't process UPDATE_GLOBAL_DB_REQ request because its already busy with syncronization"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS"); break; @@ -859,7 +862,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64); if (l_ch_chain->state != CHAIN_STATE_IDLE){ log_it(L_WARNING, "Can't process UPDATE_GLOBAL_DB_START request because its already busy with syncronization"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS"); break; @@ -907,7 +910,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(l_chain_pkt_data_size == sizeof(dap_stream_ch_chain_sync_request_t)) { if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB && l_ch_chain->state != CHAIN_STATE_IDLE) { log_it(L_WARNING, "Can't process SYNC_GLOBAL_DB request because not in idle state"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_STATE_NOT_IN_IDLE"); break; @@ -1014,7 +1017,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ:{ if (l_ch_chain->state != CHAIN_STATE_IDLE) { log_it(L_WARNING, "Can't process UPDATE_CHAINS_REQ request because its already busy with syncronization"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS"); break; @@ -1046,7 +1049,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START:{ if (l_ch_chain->state != CHAIN_STATE_IDLE) { log_it(L_WARNING, "Can't process UPDATE_CHAINS_START request because its already busy with syncronization"); - s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + dap_stream_ch_chain_pkt_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS"); break; @@ -1154,6 +1157,14 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) else log_it(L_INFO, "In: SYNC_CHAINS pkt"); } + if ((l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_END) && + HASH_COUNT(l_ch_chain->remote_atoms) > 5000) { + // TODO remove this after chains will come in order + s_stream_ch_write_error_unsafe(a_ch, l_chain_pkt->hdr.net_id.uint64, + l_chain_pkt->hdr.chain_id.uint64, l_chain_pkt->hdr.cell_id.uint64, + "ERROR_SYNC_REQUEST_IS_TOO_LARGE"); + break; + } struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); l_ch_chain->stats_request_atoms_processed = 0; if (l_ch_pkt->hdr.type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS) { @@ -1200,6 +1211,10 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) struct sync_request *l_sync_request = dap_stream_ch_chain_create_sync_request(l_chain_pkt, a_ch); dap_chain_pkt_item_t *l_pkt_item = &l_sync_request->pkt; l_pkt_item->pkt_data = DAP_NEW_SIZE(byte_t, l_chain_pkt_data_size); + if (!l_pkt_item->pkt_data) { + log_it(L_ERROR, "Not enough memory!"); + break; + } memcpy(l_pkt_item->pkt_data, l_chain_pkt->data, l_chain_pkt_data_size); l_pkt_item->pkt_data_size = l_chain_pkt_data_size; if (s_debug_more){ 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 fc2be92cdd3b535d1d68fd2438eb2ccc71759a6f..4e66d0704e0f4bcdd4e9000ad2e7c10a0545eb39 100644 --- a/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c +++ b/modules/consensus/dag-pos/dap_chain_cs_dag_pos.c @@ -37,7 +37,7 @@ typedef struct dap_chain_cs_dag_pos_pvt { - dap_cert_t * events_sign_wallet; + dap_enc_key_t *events_sign_key; char ** tokens_hold; uint64_t * tokens_hold_value; size_t tokens_hold_size; @@ -149,11 +149,15 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c const char * l_events_sign_wallet = NULL; if ( ( l_events_sign_wallet = dap_config_get_item_str(a_chain_net_cfg,"dag-pos","events-sign-wallet") ) != NULL ) { - if ( ( PVT(l_pos)->events_sign_wallet = dap_cert_find_by_name(l_events_sign_wallet)) == NULL ){ - log_it(L_ERROR,"Can't load events sign certificate, name \"%s\" is wrong",l_events_sign_wallet); - }else - log_it(L_NOTICE,"Loaded \"%s\" certificate to sign pos event", l_events_sign_wallet); - + dap_chain_wallet_t *l_wallet = dap_chain_wallet_open(l_events_sign_wallet, dap_chain_wallet_get_path(g_config)); + if (!l_wallet) { + log_it(L_ERROR,"Can't load events sign wallet, name \"%s\" is wrong", l_events_sign_wallet); + } else { + PVT(l_pos)->events_sign_key = dap_chain_wallet_get_key(l_wallet, 0); + log_it(L_NOTICE,"Loaded \"%s\" wallet to sign pos event", l_events_sign_wallet); + } + } else { + log_it(L_WARNING, "Events sign wallet is empty for %s chain, can't sing any events for it", a_chain->name); } return 0; } @@ -193,13 +197,13 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a dap_chain_net_t * l_net = dap_chain_net_by_name( a_dag->chain->net_name ); dap_chain_cs_dag_pos_t * l_pos = DAP_CHAIN_CS_DAG_POS(a_dag); - if( PVT(l_pos)->events_sign_wallet == NULL) { + if( PVT(l_pos)->events_sign_key == NULL) { log_it(L_ERROR, "Can't sign event with events-sign-wallet in [dag-pos] section"); return NULL; } 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, a_dag_event_size); + PVT(l_pos)->events_sign_key, a_hashes, a_hashes_count, a_dag_event_size); return l_event; } else return NULL; diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index b3bae67c29784c400075212ca7816f8bb8fcb6a5..ca353157593f075738de245322c60429763c1172 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -342,10 +342,11 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha size_t l_datum_size = dap_chain_datum_size(l_datum); dap_hash_fast(l_datum->data,l_datum->header.data_size,&l_hash_item->datum_data_hash ); dap_chain_hash_fast_to_str(&l_hash_item->datum_data_hash,l_hash_item->key,sizeof(l_hash_item->key)-1); - if ( !l_gdb_priv->is_load_mode ){ - dap_chain_global_db_gr_set(l_hash_item->key, l_datum, l_datum_size, l_gdb_priv->group_datums); - }else - log_it(L_DEBUG,"Load mode, doesnt save item %s:%s", l_hash_item->key, l_gdb_priv->group_datums); + if (!l_gdb_priv->is_load_mode) { + dap_chain_global_db_gr_set(dap_strdup(l_hash_item->key), DAP_DUP_SIZE(l_datum, l_datum_size), + l_datum_size, l_gdb_priv->group_datums); + } else + log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", l_hash_item->key, l_gdb_priv->group_datums); DL_APPEND(l_gdb_priv->hash_items, l_hash_item); return ATOM_ACCEPT; diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c index 520886ed774931ff3236fcb5d717f31f3e972aff..ae0b6c77d3b003f19ca1b724cacb1aa5bd0c0d1a 100644 --- a/modules/global-db/dap_chain_global_db.c +++ b/modules/global-db/dap_chain_global_db.c @@ -524,7 +524,7 @@ bool dap_chain_global_db_gr_set(char *a_key, void *a_value, size_t a_value_len, // Extract prefix if added successfuly, add history log and call notify callback if present if(!l_res) { // delete info about the deleted entry from the base if one present - global_db_gr_del_del(store_data.key, store_data.group); + global_db_gr_del_del(dap_strdup(store_data.key), store_data.group); dap_global_db_obj_track_history(&store_data); } else { log_it(L_ERROR, "Save error: %d", l_res); @@ -554,7 +554,7 @@ bool dap_chain_global_db_gr_del(char *a_key,const char *a_group) unlock(); if(l_res >= 0) { // add to Del group - global_db_gr_del_add(store_data.key, store_data.group, store_data.timestamp); + global_db_gr_del_add(dap_strdup(store_data.key), store_data.group, store_data.timestamp); } // do not add to history if l_res=1 (already deleted) if (!l_res) { diff --git a/modules/global-db/dap_chain_global_db_driver_cdb.c b/modules/global-db/dap_chain_global_db_driver_cdb.c index 1aeba149aaf31a97e43ef8511a2c7ccf1a0c0b20..daa16fef21e67113a78094968fdf49dff23ffb35 100644 --- a/modules/global-db/dap_chain_global_db_driver_cdb.c +++ b/modules/global-db/dap_chain_global_db_driver_cdb.c @@ -143,7 +143,7 @@ pcdb_instance dap_cdb_init_group(char *a_group, int a_flags) { pthread_mutex_lock(&cdb_mutex); char l_cdb_path[strlen(s_cdb_path) + strlen(a_group) + 2]; HASH_FIND_STR(s_cdb, a_group, l_cdb_i); - if (l_cdb_i && !(a_flags & (1 << 1))) { + if (l_cdb_i && !(a_flags & CDB_TRUNC)) { goto FIN; } l_cdb_i = DAP_NEW(cdb_instance); @@ -160,10 +160,10 @@ pcdb_instance dap_cdb_init_group(char *a_group, int a_flags) { log_it(L_ERROR, "An error occured while opening CDB: \"%s\"", cdb_errmsg(cdb_errno(l_cdb_i->cdb))); goto ERR; } - if (!(a_flags & (1 << 1))) { + if (!(a_flags & CDB_TRUNC)) { CDBSTAT l_cdb_stat; cdb_stat(l_cdb_i->cdb, &l_cdb_stat); - if (l_cdb_stat.rnum > 0) { + if (l_cdb_stat.rnum > 0 || !(a_flags & CDB_CREAT)) { void *l_iter = cdb_iterate_new(l_cdb_i->cdb, 0); obj_arg l_arg; l_arg.o = DAP_NEW_Z(dap_store_obj_t); @@ -230,7 +230,7 @@ int dap_db_driver_cdb_init(const char *a_cdb_path, dap_db_driver_callbacks_t *a_ if (!dap_strcmp(d->d_name, ".") || !dap_strcmp(d->d_name, "..")) { continue; } - pcdb_instance l_cdb_i = dap_cdb_init_group(d->d_name, CDB_CREAT | CDB_PAGEWARMUP); + pcdb_instance l_cdb_i = dap_cdb_init_group(d->d_name, CDB_PAGEWARMUP); if (!l_cdb_i) { dap_db_driver_cdb_deinit(); closedir(dir); @@ -490,11 +490,11 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { return -1; } if(a_store_obj->type == 'a') { - if(!a_store_obj->key) {// || !a_store_obj->value || !a_store_obj->value_len){ + if(!a_store_obj->key) { return -2; } cdb_record l_rec; - l_rec.key = dap_strdup(a_store_obj->key); + l_rec.key = a_store_obj->key; //dap_strdup(a_store_obj->key); int offset = 0; char *l_val = DAP_NEW_Z_SIZE(char, sizeof(uint64_t) + sizeof(unsigned long) + a_store_obj->value_len + sizeof(time_t)); dap_uint_to_hex(l_val, ++l_cdb_i->id, sizeof(uint64_t)); @@ -503,6 +503,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { offset += sizeof(unsigned long); if(a_store_obj->value && a_store_obj->value_len){ memcpy(l_val + offset, a_store_obj->value, a_store_obj->value_len); + DAP_DELETE(a_store_obj->value); } offset += a_store_obj->value_len; unsigned long l_time = (unsigned long)a_store_obj->timestamp; @@ -525,6 +526,7 @@ int dap_db_driver_cdb_apply_store_obj(pdap_store_obj_t a_store_obj) { ret = -1; } } + DAP_DELETE(a_store_obj->key); } return ret; } diff --git a/modules/global-db/dap_chain_global_db_driver_sqlite.c b/modules/global-db/dap_chain_global_db_driver_sqlite.c index 07b4488dabf2ce836c0fa9b66b47ab56c3d121f1..ad09e19b12b94f01b66c2a07678d62dfd2abfae3 100644 --- a/modules/global-db/dap_chain_global_db_driver_sqlite.c +++ b/modules/global-db/dap_chain_global_db_driver_sqlite.c @@ -566,26 +566,27 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) char *l_error_message = NULL; char *l_table_name = dap_db_driver_sqlite_make_table_name(a_store_obj->group); if(a_store_obj->type == 'a') { - if(!a_store_obj->key || !a_store_obj->value || !a_store_obj->value_len) + if(!a_store_obj->key) return -1; //dap_chain_hash_fast_t l_hash; //dap_hash_fast(a_store_obj->value, a_store_obj->value_len, &l_hash); char *l_blob_hash = "";//dap_db_driver_get_string_from_blob((uint8_t*) &l_hash, sizeof(dap_chain_hash_fast_t)); char *l_blob_value = dap_db_driver_get_string_from_blob(a_store_obj->value, (int)a_store_obj->value_len); + DAP_DEL_Z(a_store_obj->value); //add one record l_query = sqlite3_mprintf("insert into '%s' values(NULL, '%s', x'%s', '%lld', x'%s')", l_table_name, a_store_obj->key, l_blob_hash, a_store_obj->timestamp, l_blob_value); //dap_db_driver_sqlite_free(l_blob_hash); dap_db_driver_sqlite_free(l_blob_value); } - else if(a_store_obj->type == 'd') { + else if (a_store_obj->type == 'd') { //delete one record - if(a_store_obj->key) + if (a_store_obj->key) { l_query = sqlite3_mprintf("delete from '%s' where key = '%s'", l_table_name, a_store_obj->key); - // remove all group - else { + } else { + // remove all group l_query = sqlite3_mprintf("drop table if exists '%s'", l_table_name); } } @@ -633,6 +634,8 @@ int dap_db_driver_sqlite_apply_store_obj(dap_store_obj_t *a_store_obj) dap_db_driver_sqlite_free(l_error_message); l_ret = -1; } + if (a_store_obj->key) + DAP_DELETE(a_store_obj->key); dap_db_driver_sqlite_free(l_query); DAP_DELETE(l_table_name); return l_ret; diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c index 8954518599b1ecd341d8a9f1822c254f3db3e887..6dab70cdf0d4ab2ea8264ac2402ab917a5cadfeb 100644 --- a/modules/global-db/dap_chain_global_db_remote.c +++ b/modules/global-db/dap_chain_global_db_remote.c @@ -27,8 +27,7 @@ static bool dap_db_set_cur_node_addr_common(uint64_t a_address, char *a_net_name time_t *l_cur_time = DAP_NEW_Z(time_t); *l_cur_time= a_expire_time; char *l_key_time = dap_strdup_printf("cur_node_addr_%s_time", a_net_name); - l_ret = dap_chain_global_db_gr_set( dap_strdup(l_key_time), (uint8_t*) l_cur_time, sizeof(time_t), GROUP_LOCAL_GENERAL); - DAP_DELETE(l_key_time); + l_ret = dap_chain_global_db_gr_set(l_key_time, (uint8_t*) l_cur_time, sizeof(time_t), GROUP_LOCAL_GENERAL); } return l_ret; } @@ -106,9 +105,10 @@ bool dap_db_set_last_id_remote(uint64_t a_node_addr, uint64_t a_id, char *a_grou { //log_it( L_DEBUG, "Node 0x%016X set last synced id %"DAP_UINT64_FORMAT_U"", a_node_addr, a_id); char *l_node_addr_str = dap_strdup_printf("%ju%s", a_node_addr, a_group); - bool l_ret = dap_chain_global_db_gr_set(l_node_addr_str, &a_id, sizeof(uint64_t), + uint64_t *l_id = DAP_NEW(uint64_t); + *l_id = a_id; + bool l_ret = dap_chain_global_db_gr_set(l_node_addr_str, l_id, sizeof(uint64_t), GROUP_LOCAL_NODE_LAST_ID); - DAP_DELETE(l_node_addr_str); return l_ret; } @@ -136,9 +136,8 @@ uint64_t dap_db_get_last_id_remote(uint64_t a_node_addr, char *a_group) */ bool dap_db_set_last_hash_remote(uint64_t a_node_addr, dap_chain_t *a_chain, dap_chain_hash_fast_t *a_hash) { - //log_it( L_DEBUG, "Node 0x%016X set last synced timestamp %"DAP_UINT64_FORMAT_U"", a_id); return dap_chain_global_db_gr_set(dap_strdup_printf("%ju%s%s", a_node_addr, a_chain->net_name, a_chain->name), - a_hash, sizeof(*a_hash), GROUP_LOCAL_NODE_LAST_ID); + DAP_DUP(a_hash), sizeof(*a_hash), GROUP_LOCAL_NODE_LAST_ID); } /** diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index b5de41884c3a194821341e796eed6cc59fce0855..493be4d7d1518c8b309ddf9c8bebe56e852ec2f9 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1717,7 +1717,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) l_pub_key_data = dap_enc_key_serealize_pub_key(l_cert->enc_key, &l_pub_key_data_size); // save pub key if(l_pub_key_data && l_pub_key_data_size > 0) - dap_chain_global_db_gr_set(dap_strdup("cur-node-addr-pkey"), (uint8_t*) l_pub_key_data, l_pub_key_data_size, + dap_chain_global_db_gr_set(dap_strdup("cur-node-addr-pkey"), DAP_DUP_SIZE(l_pub_key_data, l_pub_key_data_size), l_pub_key_data_size, GROUP_LOCAL_NODE_ADDR); } } diff --git a/modules/net/dap_chain_node.c b/modules/net/dap_chain_node.c index 817455ff9e922ce73b65281a17ff5d93668e425a..e06be2f21235b58170e722e6f8b928d5b7bf11c0 100644 --- a/modules/net/dap_chain_node.c +++ b/modules/net/dap_chain_node.c @@ -82,20 +82,10 @@ bool dap_chain_node_check_addr(dap_chain_net_t * a_net,dap_chain_node_addr_t *ad /** * Register alias in base */ -bool dap_chain_node_alias_register(dap_chain_net_t * a_net,const char *alias, dap_chain_node_addr_t *addr) +bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr) { - char *a_key = strdup(alias); - dap_chain_node_addr_t *l_addr = DAP_NEW_Z(dap_chain_node_addr_t); - memcpy(l_addr,addr,sizeof (*l_addr)); -// char a_value[2 * sizeof(dap_chain_node_addr_t) + 1]; -// if(bin2hex(a_value, (const unsigned char *) addr, sizeof(dap_chain_node_addr_t)) == -1) -// return false; -// a_value[2 * sizeof(dap_chain_node_addr_t)] = '\0'; - bool res = dap_chain_global_db_gr_set( dap_strdup(a_key), l_addr, sizeof(dap_chain_node_addr_t) - , a_net->pub.gdb_nodes_aliases); - DAP_DELETE(l_addr); - DAP_DELETE(a_key); - return res; + return dap_chain_global_db_gr_set( dap_strdup(a_alias), DAP_DUP(a_addr), + sizeof(dap_chain_node_addr_t), a_net->pub.gdb_nodes_aliases); } /** @@ -150,12 +140,8 @@ int dap_chain_node_info_save(dap_chain_net_t * a_net, dap_chain_node_info_t *a_n } //char *a_value = dap_chain_node_info_serialize(node_info, NULL); size_t l_node_info_size = dap_chain_node_info_get_size(a_node_info); - dap_chain_node_info_t *l_node_info = DAP_NEW_Z_SIZE(dap_chain_node_info_t, l_node_info_size); - memcpy(l_node_info, a_node_info, sizeof (*a_node_info) ); - bool res = dap_chain_global_db_gr_set( dap_strdup(l_key), l_node_info, l_node_info_size, a_net->pub.gdb_nodes); - DAP_DELETE(l_key); - //DAP_DELETE(a_value); - return res?0:-3; + bool res = dap_chain_global_db_gr_set(l_key, DAP_DUP(a_node_info), l_node_info_size, a_net->pub.gdb_nodes); + return res ? 0 : -3; } /** @@ -299,11 +285,12 @@ bool dap_chain_node_mempool_autoproc_init() dap_global_db_obj_t *l_objs = dap_chain_global_db_gr_load(l_gdb_group_mempool, &l_objs_size); if (l_objs_size) { for (size_t i = 0; i < l_objs_size; i++) { + // Delete processed objects + dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); + if (!l_objs[i].value_len) + continue; dap_chain_datum_t *l_datum = (dap_chain_datum_t *)l_objs[i].value; - if (dap_chain_node_mempool_process(l_chain, l_role, l_datum)) { - // Delete processed objects - dap_chain_global_db_gr_del(dap_strdup(l_objs[i].key), l_gdb_group_mempool); - } + dap_chain_node_mempool_process(l_chain, l_role, l_datum); } dap_chain_global_db_objs_delete(l_objs, l_objs_size); } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index dbc1b41cd2c707f38f42eb9e86dfca977eb2bcba..a4f785885554560c445b54e09dc44b4c49935daf 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -3050,29 +3050,19 @@ int com_token_decl(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r l_gdb_group_mempool = dap_chain_net_get_gdb_group_mempool_by_chain_type(l_net, CHAIN_TYPE_TOKEN); } - + int l_ret = 0; if(dap_chain_global_db_gr_set(dap_strdup(l_key_str), (uint8_t *) l_datum, l_datum_size, l_gdb_group_mempool)) { if(!dap_strcmp(l_hash_out_type,"hex")) dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str, l_ticker); else dap_chain_node_cli_set_reply_text(a_str_reply, "datum %s with token %s is placed in datum pool ", l_key_str_base58, l_ticker); - DAP_DELETE(l_datum); - DAP_DELETE(l_datum_token); - DAP_DELETE(l_gdb_group_mempool); - DAP_DELETE(l_key_str); - DAP_DELETE(l_key_str_base58); - return 0; } else { dap_chain_node_cli_set_reply_text(a_str_reply, "datum tx %s is not placed in datum pool ", l_key_str_base58); DAP_DELETE(l_datum); - DAP_DELETE(l_datum_token); - DAP_DELETE(l_gdb_group_mempool); - DAP_DELETE(l_key_str); - DAP_DELETE(l_key_str_base58); - return -2; + l_ret = -2; } - return 0; + return l_ret; } /** @@ -3379,7 +3369,6 @@ int com_token_emit(int a_argc, char ** a_argv, void *a_arg_func, char ** a_str_r return -2; } DAP_DELETE(str_reply_tmp); - DAP_DELETE(l_datum_tx); DAP_DELETE(l_addr); return 0; } diff --git a/modules/net/include/dap_chain_node.h b/modules/net/include/dap_chain_node.h index 9d84beabcc2a289a3024f185ffea98de15c43d8a..216d6a4261c130a77397d44fc5eecd8cc75856af 100644 --- a/modules/net/include/dap_chain_node.h +++ b/modules/net/include/dap_chain_node.h @@ -132,7 +132,7 @@ dap_chain_node_addr_t* dap_chain_node_gen_addr(dap_chain_net_t * l_net,dap_chain bool dap_chain_node_check_addr(dap_chain_net_t * l_net,dap_chain_node_addr_t *addr, dap_chain_cell_id_t *a_cell_id); dap_chain_node_addr_t * dap_chain_node_alias_find(dap_chain_net_t * l_net,const char *alias); -bool dap_chain_node_alias_register(dap_chain_net_t * l_net,const char *alias, dap_chain_node_addr_t *addr); +bool dap_chain_node_alias_register(dap_chain_net_t *a_net, const char *a_alias, dap_chain_node_addr_t *a_addr); bool dap_chain_node_alias_delete(dap_chain_net_t * l_net,const char *alias); int dap_chain_node_info_save(dap_chain_net_t * l_net,dap_chain_node_info_t *node_info); diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index d7f3a180174e12eff5fda443ca7cb7cc338624c8..6488d2aaebaee9733f07717f67b10f30c1a3dd6e 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -248,13 +248,12 @@ static dap_chain_hash_fast_t* dap_chain_net_vpn_client_tx_cond_hash(dap_chain_ne log_it(L_ERROR, "Can't create condition for user"); } else { // save transaction for login - dap_chain_global_db_gr_set("client_tx_cond_hash", l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), + dap_chain_global_db_gr_set(dap_strdup("client_tx_cond_hash"), l_tx_cond_hash, sizeof(dap_chain_hash_fast_t), l_gdb_group); } //DAP_DELETE(l_addr_from_str); DAP_DELETE(l_pub_key_data); } - DAP_DELETE(l_tx_cond_hash); dap_enc_key_delete(l_enc_key); DAP_DELETE(l_gdb_group); return l_tx_cond_hash;