summaryrefslogtreecommitdiff
path: root/protocols/Tox/libtox/src/toxcore/Messenger.c
diff options
context:
space:
mode:
Diffstat (limited to 'protocols/Tox/libtox/src/toxcore/Messenger.c')
-rw-r--r--protocols/Tox/libtox/src/toxcore/Messenger.c149
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);
}