diff options
Diffstat (limited to 'protocols/Tox/libtox/src/toxcore/Messenger.c')
-rw-r--r-- | protocols/Tox/libtox/src/toxcore/Messenger.c | 149 |
1 files changed, 67 insertions, 82 deletions
diff --git a/protocols/Tox/libtox/src/toxcore/Messenger.c b/protocols/Tox/libtox/src/toxcore/Messenger.c index ddd04518a5..556acc272f 100644 --- a/protocols/Tox/libtox/src/toxcore/Messenger.c +++ b/protocols/Tox/libtox/src/toxcore/Messenger.c @@ -28,16 +28,14 @@ static int write_cryptpacket_id(const Messenger *m, int32_t friendnumber, uint8_ uint32_t length, uint8_t congestion_control); static void m_register_default_plugins(Messenger *m); -// friend_not_valid determines if the friendnumber passed is valid in the Messenger object -static uint8_t friend_not_valid(const Messenger *m, int32_t friendnumber) +/** + * Determines if the friendnumber passed is valid in the Messenger object. + * + * @param friendnumber The index in the friend list. + */ +static bool friend_is_valid(const Messenger *m, int32_t friendnumber) { - if ((unsigned int)friendnumber < m->numfriends) { - if (m->friendlist[friendnumber].status != 0) { - return 0; - } - } - - return 1; + return (unsigned int)friendnumber < m->numfriends && m->friendlist[friendnumber].status != 0; } /* Set the size of the friend list to numfriends. @@ -88,7 +86,7 @@ int32_t getfriend_id(const Messenger *m, const uint8_t *real_pk) */ int get_real_pk(const Messenger *m, int32_t friendnumber, uint8_t *real_pk) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -101,7 +99,7 @@ int get_real_pk(const Messenger *m, int32_t friendnumber, uint8_t *real_pk) */ int getfriendcon_id(const Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -140,7 +138,7 @@ void getaddress(const Messenger *m, uint8_t *address) static int send_online_packet(Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return 0; } @@ -163,6 +161,12 @@ static int m_handle_lossy_packet(void *object, int friend_num, const uint8_t *pa static int32_t init_new_friend(Messenger *m, const uint8_t *real_pk, uint8_t status) { + if (m->numfriends == UINT32_MAX) { + LOGGER_ERROR(m->log, "Friend list full: we have more than 4 billion friends"); + /* This is technically incorrect, but close enough. */ + return FAERR_NOMEM; + } + /* Resize the friend list if necessary. */ if (realloc_friendlist(m, m->numfriends + 1) != 0) { return FAERR_NOMEM; @@ -301,7 +305,7 @@ int32_t m_addfriend_norequest(Messenger *m, const uint8_t *real_pk) static int clear_receipts(Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -320,7 +324,7 @@ static int clear_receipts(Messenger *m, int32_t friendnumber) static int add_receipt(Messenger *m, int32_t friendnumber, uint32_t packet_num, uint32_t msg_id) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -349,7 +353,7 @@ static int add_receipt(Messenger *m, int32_t friendnumber, uint32_t packet_num, */ static int friend_received_packet(const Messenger *m, int32_t friendnumber, uint32_t number) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -359,7 +363,7 @@ static int friend_received_packet(const Messenger *m, int32_t friendnumber, uint static int do_receipts(Messenger *m, int32_t friendnumber, void *userdata) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -397,7 +401,7 @@ static int do_receipts(Messenger *m, int32_t friendnumber, void *userdata) */ int m_delfriend(Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -435,7 +439,7 @@ int m_delfriend(Messenger *m, int32_t friendnumber) int m_get_friend_connectionstatus(const Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -463,7 +467,7 @@ int m_get_friend_connectionstatus(const Messenger *m, int32_t friendnumber) int m_friend_exists(const Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return 0; } @@ -487,7 +491,7 @@ int m_send_message_generic(Messenger *m, int32_t friendnumber, uint8_t type, con return -5; } - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { LOGGER_ERROR(m->log, "Friend number %d is invalid", friendnumber); return -1; } @@ -548,7 +552,7 @@ static int m_sendname(const Messenger *m, int32_t friendnumber, const uint8_t *n */ int setfriendname(Messenger *m, int32_t friendnumber, const uint8_t *name, uint16_t length) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -617,7 +621,7 @@ uint16_t getself_name(const Messenger *m, uint8_t *name) */ int getname(const Messenger *m, int32_t friendnumber, uint8_t *name) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -627,7 +631,7 @@ int getname(const Messenger *m, int32_t friendnumber, uint8_t *name) int m_get_name_size(const Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -689,7 +693,7 @@ int m_set_userstatus(Messenger *m, uint8_t status) */ int m_get_statusmessage_size(const Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -701,7 +705,7 @@ int m_get_statusmessage_size(const Messenger *m, int32_t friendnumber) */ int m_copy_statusmessage(const Messenger *m, int32_t friendnumber, uint8_t *buf, uint32_t maxlen) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -730,7 +734,7 @@ int m_copy_self_statusmessage(const Messenger *m, uint8_t *buf) uint8_t m_get_userstatus(const Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return USERSTATUS_INVALID; } @@ -750,7 +754,7 @@ uint8_t m_get_self_userstatus(const Messenger *m) uint64_t m_get_last_online(const Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return UINT64_MAX; } @@ -763,7 +767,7 @@ int m_set_usertyping(Messenger *m, int32_t friendnumber, uint8_t is_typing) return -1; } - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -779,7 +783,7 @@ int m_set_usertyping(Messenger *m, int32_t friendnumber, uint8_t is_typing) int m_get_istyping(const Messenger *m, int32_t friendnumber) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -804,7 +808,7 @@ static int send_user_istyping(const Messenger *m, int32_t friendnumber, uint8_t static int set_friend_statusmessage(const Messenger *m, int32_t friendnumber, const uint8_t *status, uint16_t length) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -952,7 +956,7 @@ static void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status static int write_cryptpacket_id(const Messenger *m, int32_t friendnumber, uint8_t packet_id, const uint8_t *data, uint32_t length, uint8_t congestion_control) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return 0; } @@ -1033,7 +1037,7 @@ void callback_file_reqchunk(Messenger *m, m_file_chunk_request_cb *function) */ int file_get_id(const Messenger *m, int32_t friendnumber, uint32_t filenumber, uint8_t *file_id) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1082,7 +1086,7 @@ int file_get_id(const Messenger *m, int32_t friendnumber, uint32_t filenumber, u static int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t filenumber, uint32_t file_type, uint64_t filesize, const uint8_t *file_id, const uint8_t *filename, uint16_t filename_length) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return 0; } @@ -1116,7 +1120,7 @@ static int file_sendrequest(const Messenger *m, int32_t friendnumber, uint8_t fi long int new_filesender(const Messenger *m, int32_t friendnumber, uint32_t file_type, uint64_t filesize, const uint8_t *file_id, const uint8_t *filename, uint16_t filename_length) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1195,7 +1199,7 @@ static int send_file_control_packet(const Messenger *m, int32_t friendnumber, ui */ int file_control(const Messenger *m, int32_t friendnumber, uint32_t filenumber, unsigned int control) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1296,7 +1300,7 @@ int file_control(const Messenger *m, int32_t friendnumber, uint32_t filenumber, */ int file_seek(const Messenger *m, int32_t friendnumber, uint32_t filenumber, uint64_t position) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1352,7 +1356,7 @@ int file_seek(const Messenger *m, int32_t friendnumber, uint32_t filenumber, uin static int64_t send_file_data_packet(const Messenger *m, int32_t friendnumber, uint8_t filenumber, const uint8_t *data, uint16_t length) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1384,7 +1388,7 @@ static int64_t send_file_data_packet(const Messenger *m, int32_t friendnumber, u int file_data(const Messenger *m, int32_t friendnumber, uint32_t filenumber, uint64_t position, const uint8_t *data, uint16_t length) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1446,38 +1450,6 @@ int file_data(const Messenger *m, int32_t friendnumber, uint32_t filenumber, uin return -6; } -/* Give the number of bytes left to be sent/received. - * - * send_receive is 0 if we want the sending files, 1 if we want the receiving. - * - * return number of bytes remaining to be sent/received on success - * return 0 on failure - */ -uint64_t file_dataremaining(const Messenger *m, int32_t friendnumber, uint8_t filenumber, uint8_t send_receive) -{ - if (friend_not_valid(m, friendnumber)) { - return 0; - } - - const struct File_Transfers *const sending = &m->friendlist[friendnumber].file_sending[filenumber]; - - if (send_receive == 0) { - if (sending->status == FILESTATUS_NONE) { - return 0; - } - - return sending->size - sending->transferred; - } - - const struct File_Transfers *const receiving = &m->friendlist[friendnumber].file_receiving[filenumber]; - - if (receiving->status == FILESTATUS_NONE) { - return 0; - } - - return receiving->size - receiving->transferred; -} - /** * Iterate over all file transfers and request chunks (from the client) for each * of them. @@ -1776,7 +1748,7 @@ static int m_handle_lossy_packet(void *object, int friend_num, const uint8_t *pa { Messenger *m = (Messenger *)object; - if (friend_not_valid(m, friend_num)) { + if (!friend_is_valid(m, friend_num)) { return 1; } @@ -1806,7 +1778,7 @@ void custom_lossy_packet_registerhandler(Messenger *m, m_friend_lossy_packet_cb int m_callback_rtp_packet(Messenger *m, int32_t friendnumber, uint8_t byte, m_lossy_rtp_packet_cb *function, void *object) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1829,7 +1801,7 @@ int m_callback_rtp_packet(Messenger *m, int32_t friendnumber, uint8_t byte, m_lo */ int m_send_custom_lossy_packet(const Messenger *m, int32_t friendnumber, const uint8_t *data, uint32_t length) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1859,7 +1831,7 @@ static int handle_custom_lossless_packet(void *object, int friend_num, const uin { Messenger *m = (Messenger *)object; - if (friend_not_valid(m, friend_num)) { + if (!friend_is_valid(m, friend_num)) { return -1; } @@ -1881,7 +1853,7 @@ void custom_lossless_packet_registerhandler(Messenger *m, m_friend_lossless_pack int send_custom_lossless_packet(const Messenger *m, int32_t friendnumber, const uint8_t *data, uint32_t length) { - if (friend_not_valid(m, friendnumber)) { + if (!friend_is_valid(m, friendnumber)) { return -1; } @@ -1889,7 +1861,8 @@ int send_custom_lossless_packet(const Messenger *m, int32_t friendnumber, const return -2; } - if (data[0] < PACKET_ID_RANGE_LOSSLESS_CUSTOM_START || data[0] > PACKET_ID_RANGE_LOSSLESS_CUSTOM_END) { + if ((data[0] < PACKET_ID_RANGE_LOSSLESS_CUSTOM_START || data[0] > PACKET_ID_RANGE_LOSSLESS_CUSTOM_END) + && data[0] != PACKET_ID_MSI) { return -3; } @@ -1994,8 +1967,8 @@ Messenger *new_messenger(Mono_Time *mono_time, Messenger_Options *options, unsig m->net_crypto = new_net_crypto(m->log, m->mono_time, m->dht, &options->proxy_info); if (m->net_crypto == nullptr) { - kill_networking(m->net); kill_dht(m->dht); + kill_networking(m->net); friendreq_kill(m->fr); logger_kill(m->log); free(m); @@ -2007,7 +1980,7 @@ Messenger *new_messenger(Mono_Time *mono_time, Messenger_Options *options, unsig m->onion_c = new_onion_client(m->mono_time, m->net_crypto); m->fr_c = new_friend_connections(m->mono_time, m->onion_c, options->local_discovery_enabled); - if (!(m->onion && m->onion_a && m->onion_c)) { + if (!(m->onion && m->onion_a && m->onion_c && m->fr_c)) { kill_friend_connections(m->fr_c); kill_onion(m->onion); kill_onion_announce(m->onion_a); @@ -2651,7 +2624,7 @@ void do_messenger(Messenger *m, void *userdata) } if (m->numfriends != dht_get_num_friends(m->dht)) { - LOGGER_TRACE(m->log, "Friend num in DHT %u != friend num in msger %u\n", dht_get_num_friends(m->dht), m->numfriends); + LOGGER_TRACE(m->log, "Friend num in DHT %u != friend num in msger %u", dht_get_num_friends(m->dht), m->numfriends); } Friend *msgfptr; @@ -3139,13 +3112,14 @@ static uint8_t *save_tcp_relays(const Messenger *m, uint8_t *data) Node_format relays[NUM_SAVED_TCP_RELAYS]; uint8_t *temp_data = data; data = state_write_section_header(temp_data, STATE_COOKIE_TYPE, 0, STATE_TYPE_TCP_RELAY); - uint32_t num = copy_connected_tcp_relays(m->net_crypto, relays, NUM_SAVED_TCP_RELAYS); if (m->num_loaded_relays > 0) { memcpy(relays, m->loaded_relays, sizeof(Node_format) * m->num_loaded_relays); - num = min_u32(num + m->num_loaded_relays, NUM_SAVED_TCP_RELAYS); } + uint32_t num = m->num_loaded_relays; + num += copy_connected_tcp_relays(m->net_crypto, relays + num, NUM_SAVED_TCP_RELAYS - num); + int l = pack_nodes(data, NUM_SAVED_TCP_RELAYS * packed_node_size(net_family_tcp_ipv6), relays, num); if (l > 0) { @@ -3160,7 +3134,14 @@ static uint8_t *save_tcp_relays(const Messenger *m, uint8_t *data) static State_Load_Status load_tcp_relays(Messenger *m, const uint8_t *data, uint32_t length) { if (length != 0) { - m->num_loaded_relays = unpack_nodes(m->loaded_relays, NUM_SAVED_TCP_RELAYS, nullptr, data, length, 1); + const int num = unpack_nodes(m->loaded_relays, NUM_SAVED_TCP_RELAYS, nullptr, data, length, 1); + + if (num == -1) { + m->num_loaded_relays = 0; + return STATE_LOAD_STATUS_CONTINUE; + } + + m->num_loaded_relays = num; m->has_added_relays = false; } @@ -3198,6 +3179,10 @@ static State_Load_Status load_path_nodes(Messenger *m, const uint8_t *data, uint if (length != 0) { const int num = unpack_nodes(nodes, NUM_SAVED_PATH_NODES, nullptr, data, length, 0); + if (num == -1) { + return STATE_LOAD_STATUS_CONTINUE; + } + for (int i = 0; i < num; ++i) { onion_add_bs_path_node(m->onion_c, nodes[i].ip_port, nodes[i].public_key); } |