diff options
Diffstat (limited to 'protocols/Tox/libtox')
35 files changed, 1745 insertions, 1305 deletions
diff --git a/protocols/Tox/libtox/src/toxcore/DHT.c b/protocols/Tox/libtox/src/toxcore/DHT.c index a42515181c..4acfa1617d 100644 --- a/protocols/Tox/libtox/src/toxcore/DHT.c +++ b/protocols/Tox/libtox/src/toxcore/DHT.c @@ -59,6 +59,92 @@ #define ASSOC_COUNT 2 +struct DHT { + Logger *log; + Networking_Core *net; + + bool hole_punching_enabled; + + Client_data close_clientlist[LCLIENT_LIST]; + uint64_t close_lastgetnodes; + uint32_t close_bootstrap_times; + + /* DHT keypair */ + uint8_t self_public_key[CRYPTO_PUBLIC_KEY_SIZE]; + uint8_t self_secret_key[CRYPTO_SECRET_KEY_SIZE]; + + DHT_Friend *friends_list; + uint16_t num_friends; + + Node_format *loaded_nodes_list; + uint32_t loaded_num_nodes; + unsigned int loaded_nodes_index; + + Shared_Keys shared_keys_recv; + Shared_Keys shared_keys_sent; + + struct Ping *ping; + Ping_Array *dht_ping_array; + Ping_Array *dht_harden_ping_array; + uint64_t last_run; + + Cryptopacket_Handles cryptopackethandlers[256]; + + Node_format to_bootstrap[MAX_CLOSE_TO_BOOTSTRAP_NODES]; + unsigned int num_to_bootstrap; +}; + +const uint8_t *dht_get_self_public_key(const DHT *dht) +{ + return dht->self_public_key; +} +const uint8_t *dht_get_self_secret_key(const DHT *dht) +{ + return dht->self_secret_key; +} + +void dht_set_self_public_key(DHT *dht, const uint8_t *key) +{ + memcpy(dht->self_public_key, key, CRYPTO_PUBLIC_KEY_SIZE); +} +void dht_set_self_secret_key(DHT *dht, const uint8_t *key) +{ + memcpy(dht->self_secret_key, key, CRYPTO_SECRET_KEY_SIZE); +} + +Networking_Core *dht_get_net(const DHT *dht) +{ + return dht->net; +} +struct Ping *dht_get_ping(const DHT *dht) +{ + return dht->ping; +} +const Client_data *dht_get_close_clientlist(const DHT *dht) +{ + return dht->close_clientlist; +} +const Client_data *dht_get_close_client(const DHT *dht, uint32_t client_num) +{ + assert(client_num < sizeof(dht->close_clientlist) / sizeof(dht->close_clientlist[0])); + return &dht->close_clientlist[client_num]; +} +uint16_t dht_get_num_friends(const DHT *dht) +{ + return dht->num_friends; +} + +DHT_Friend *dht_get_friend(DHT *dht, uint32_t friend_num) +{ + assert(friend_num < dht->num_friends); + return &dht->friends_list[friend_num]; +} +const uint8_t *dht_get_friend_public_key(const DHT *dht, uint32_t friend_num) +{ + assert(friend_num < dht->num_friends); + return dht->friends_list[friend_num].public_key; +} + /* Compares pk1 and pk2 with pk. * * return 0 if both are same distance. @@ -68,8 +154,8 @@ int id_closest(const uint8_t *pk, const uint8_t *pk1, const uint8_t *pk2) { for (size_t i = 0; i < CRYPTO_PUBLIC_KEY_SIZE; ++i) { - uint8_t distance1 = pk[i] ^ pk1[i]; - uint8_t distance2 = pk[i] ^ pk2[i]; + const uint8_t distance1 = pk[i] ^ pk1[i]; + const uint8_t distance2 = pk[i] ^ pk2[i]; if (distance1 < distance2) { return 1; @@ -96,7 +182,7 @@ static unsigned int bit_by_bit_cmp(const uint8_t *pk1, const uint8_t *pk2) } for (j = 0; j < 8; ++j) { - uint8_t mask = 1 << (7 - j); + const uint8_t mask = 1 << (7 - j); if ((pk1[i] & mask) != (pk2[i] & mask)) { break; @@ -121,8 +207,8 @@ void get_shared_key(Shared_Keys *shared_keys, uint8_t *shared_key, const uint8_t uint32_t curr = 0; for (uint32_t i = 0; i < MAX_KEYS_PER_SLOT; ++i) { - int index = public_key[30] * MAX_KEYS_PER_SLOT + i; - Shared_Key *key = &shared_keys->keys[index]; + const int index = public_key[30] * MAX_KEYS_PER_SLOT + i; + Shared_Key *const key = &shared_keys->keys[index]; if (key->stored) { if (id_equal(public_key, key->public_key)) { @@ -149,8 +235,8 @@ void get_shared_key(Shared_Keys *shared_keys, uint8_t *shared_key, const uint8_t encrypt_precompute(public_key, secret_key, shared_key); - if (num != (uint32_t)~0) { - Shared_Key *key = &shared_keys->keys[curr]; + if (num != UINT32_MAX) { + Shared_Key *const key = &shared_keys->keys[curr]; key->stored = 1; key->times_requested = 1; memcpy(key->public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE); @@ -198,13 +284,13 @@ int create_request(const uint8_t *send_public_key, const uint8_t *send_secret_ke return -1; } - uint8_t *nonce = packet + 1 + CRYPTO_PUBLIC_KEY_SIZE * 2; + uint8_t *const nonce = packet + 1 + CRYPTO_PUBLIC_KEY_SIZE * 2; random_nonce(nonce); uint8_t temp[MAX_CRYPTO_REQUEST_SIZE]; memcpy(temp + 1, data, length); temp[0] = request_id; - int len = encrypt_data(recv_public_key, send_secret_key, nonce, temp, length + 1, - CRYPTO_SIZE + packet); + const int len = encrypt_data(recv_public_key, send_secret_key, nonce, temp, length + 1, + CRYPTO_SIZE + packet); if (len == -1) { crypto_memzero(temp, MAX_CRYPTO_REQUEST_SIZE); @@ -241,7 +327,7 @@ int handle_request(const uint8_t *self_public_key, const uint8_t *self_secret_ke } memcpy(public_key, packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, CRYPTO_PUBLIC_KEY_SIZE); - const uint8_t *nonce = packet + 1 + CRYPTO_PUBLIC_KEY_SIZE * 2; + const uint8_t *const nonce = packet + 1 + CRYPTO_PUBLIC_KEY_SIZE * 2; uint8_t temp[MAX_CRYPTO_REQUEST_SIZE]; int len1 = decrypt_data(public_key, self_secret_key, nonce, packet + CRYPTO_SIZE, length - CRYPTO_SIZE, temp); @@ -288,7 +374,7 @@ int packed_node_size(uint8_t ip_family) */ int pack_ip_port(uint8_t *data, uint16_t length, const IP_Port *ip_port) { - if (data == NULL) { + if (data == nullptr) { return -1; } @@ -313,25 +399,25 @@ int pack_ip_port(uint8_t *data, uint16_t length, const IP_Port *ip_port) } if (is_ipv4) { - uint32_t size = 1 + SIZE_IP4 + sizeof(uint16_t); + const uint32_t size = 1 + SIZE_IP4 + sizeof(uint16_t); if (size > length) { return -1; } data[0] = net_family; - memcpy(data + 1, &ip_port->ip.ip4, SIZE_IP4); + memcpy(data + 1, &ip_port->ip.ip.v4, SIZE_IP4); memcpy(data + 1 + SIZE_IP4, &ip_port->port, sizeof(uint16_t)); return size; } else { - uint32_t size = 1 + SIZE_IP6 + sizeof(uint16_t); + const uint32_t size = 1 + SIZE_IP6 + sizeof(uint16_t); if (size > length) { return -1; } data[0] = net_family; - memcpy(data + 1, &ip_port->ip.ip6, SIZE_IP6); + memcpy(data + 1, &ip_port->ip.ip.v6, SIZE_IP6); memcpy(data + 1 + SIZE_IP6, &ip_port->port, sizeof(uint16_t)); return size; } @@ -345,7 +431,7 @@ static int DHT_create_packet(const uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE], random_nonce(nonce); - int encrypted_length = encrypt_data_symmetric(shared_key, nonce, plain, plain_length, encrypted); + const int encrypted_length = encrypt_data_symmetric(shared_key, nonce, plain, plain_length, encrypted); if (encrypted_length == -1) { return -1; @@ -366,7 +452,7 @@ static int DHT_create_packet(const uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE], */ int unpack_ip_port(IP_Port *ip_port, const uint8_t *data, uint16_t length, uint8_t tcp_enabled) { - if (data == NULL) { + if (data == nullptr) { return -1; } @@ -398,25 +484,25 @@ int unpack_ip_port(IP_Port *ip_port, const uint8_t *data, uint16_t length, uint8 } if (is_ipv4) { - uint32_t size = 1 + SIZE_IP4 + sizeof(uint16_t); + const uint32_t size = 1 + SIZE_IP4 + sizeof(uint16_t); if (size > length) { return -1; } ip_port->ip.family = host_family; - memcpy(&ip_port->ip.ip4, data + 1, SIZE_IP4); + memcpy(&ip_port->ip.ip.v4, data + 1, SIZE_IP4); memcpy(&ip_port->port, data + 1 + SIZE_IP4, sizeof(uint16_t)); return size; } else { - uint32_t size = 1 + SIZE_IP6 + sizeof(uint16_t); + const uint32_t size = 1 + SIZE_IP6 + sizeof(uint16_t); if (size > length) { return -1; } ip_port->ip.family = host_family; - memcpy(&ip_port->ip.ip6, data + 1, SIZE_IP6); + memcpy(&ip_port->ip.ip.v6, data + 1, SIZE_IP6); memcpy(&ip_port->port, data + 1 + SIZE_IP6, sizeof(uint16_t)); return size; } @@ -432,7 +518,7 @@ int pack_nodes(uint8_t *data, uint16_t length, const Node_format *nodes, uint16_ uint32_t packed_length = 0; for (uint32_t i = 0; i < number && packed_length < length; ++i) { - int ipp_size = pack_ip_port(data + packed_length, length - packed_length, &nodes[i].ip_port); + const int ipp_size = pack_ip_port(data + packed_length, length - packed_length, &nodes[i].ip_port); if (ipp_size == -1) { return -1; @@ -447,7 +533,7 @@ int pack_nodes(uint8_t *data, uint16_t length, const Node_format *nodes, uint16_ memcpy(data + packed_length, nodes[i].public_key, CRYPTO_PUBLIC_KEY_SIZE); packed_length += CRYPTO_PUBLIC_KEY_SIZE; - uint32_t increment = ipp_size + CRYPTO_PUBLIC_KEY_SIZE; + const uint32_t increment = ipp_size + CRYPTO_PUBLIC_KEY_SIZE; assert(increment == PACKED_NODE_SIZE_IP4 || increment == PACKED_NODE_SIZE_IP6); } @@ -467,7 +553,7 @@ int unpack_nodes(Node_format *nodes, uint16_t max_num_nodes, uint16_t *processed uint32_t num = 0, len_processed = 0; while (num < max_num_nodes && len_processed < length) { - int ipp_size = unpack_ip_port(&nodes[num].ip_port, data + len_processed, length - len_processed, tcp_enabled); + const int ipp_size = unpack_ip_port(&nodes[num].ip_port, data + len_processed, length - len_processed, tcp_enabled); if (ipp_size == -1) { return -1; @@ -483,7 +569,7 @@ int unpack_nodes(Node_format *nodes, uint16_t max_num_nodes, uint16_t *processed len_processed += CRYPTO_PUBLIC_KEY_SIZE; ++num; - uint32_t increment = ipp_size + CRYPTO_PUBLIC_KEY_SIZE; + const uint32_t increment = ipp_size + CRYPTO_PUBLIC_KEY_SIZE; assert(increment == PACKED_NODE_SIZE_IP4 || increment == PACKED_NODE_SIZE_IP6); } @@ -529,8 +615,8 @@ static uint32_t index_of_node_pk(const Node_format *array, uint32_t size, const static uint32_t index_of_client_ip_port(const Client_data *array, uint32_t size, const IP_Port *ip_port) { for (uint32_t i = 0; i < size; ++i) { - if (ip_port->ip.family == TOX_AF_INET && ipport_equal(&array[i].assoc4.ip_port, ip_port) || - ip_port->ip.family == TOX_AF_INET6 && ipport_equal(&array[i].assoc6.ip_port, ip_port)) { + if ((ip_port->ip.family == TOX_AF_INET && ipport_equal(&array[i].assoc4.ip_port, ip_port)) || + (ip_port->ip.family == TOX_AF_INET6 && ipport_equal(&array[i].assoc6.ip_port, ip_port))) { return i; } } @@ -583,7 +669,7 @@ static void update_client(Logger *log, int index, Client_data *client, IP_Port i static int client_or_ip_port_in_list(Logger *log, Client_data *list, uint16_t length, const uint8_t *public_key, IP_Port ip_port) { - uint64_t temp_time = unix_time(); + const uint64_t temp_time = unix_time(); uint32_t index = index_of_client_pk(list, length, public_key); /* if public_key is in list, find it and maybe overwrite ip_port */ @@ -677,14 +763,14 @@ static void get_close_nodes_inner(const uint8_t *public_key, Node_format *nodes_ uint32_t num_nodes = *num_nodes_ptr; for (uint32_t i = 0; i < client_list_length; i++) { - const Client_data *client = &client_list[i]; + const Client_data *const client = &client_list[i]; /* node already in list? */ if (index_of_node_pk(nodes_list, MAX_SENT_NODES, client->public_key) != UINT32_MAX) { continue; } - const IPPTsPng *ipptp = NULL; + const IPPTsPng *ipptp = nullptr; if (sa_family == TOX_AF_INET) { ipptp = &client->assoc4; @@ -775,8 +861,8 @@ static int cmp_dht_entry(const void *a, const void *b) DHT_Cmp_data cmp1, cmp2; memcpy(&cmp1, a, sizeof(DHT_Cmp_data)); memcpy(&cmp2, b, sizeof(DHT_Cmp_data)); - Client_data entry1 = cmp1.entry; - Client_data entry2 = cmp2.entry; + const Client_data entry1 = cmp1.entry; + const Client_data entry2 = cmp2.entry; const uint8_t *cmp_public_key = cmp1.base_public_key; #define ASSOC_TIMEOUT(assoc) is_timeout((assoc).timestamp, BAD_NODE_TIMEOUT) @@ -809,7 +895,7 @@ static int cmp_dht_entry(const void *a, const void *b) return 1; } - int close = id_closest(cmp_public_key, entry1.public_key, entry2.public_key); + const int close = id_closest(cmp_public_key, entry1.public_key, entry2.public_key); if (close == 1) { return 1; @@ -829,9 +915,9 @@ static int cmp_dht_entry(const void *a, const void *b) */ static unsigned int store_node_ok(const Client_data *client, const uint8_t *public_key, const uint8_t *comp_public_key) { - return is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) && - is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT) || - id_closest(comp_public_key, client->public_key, public_key) == 2; + return (is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) + && is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT)) + || id_closest(comp_public_key, client->public_key, public_key) == 2; } static void sort_client_list(Client_data *list, unsigned int length, const uint8_t *comp_public_key) @@ -854,8 +940,8 @@ static void sort_client_list(Client_data *list, unsigned int length, const uint8 static void update_client_with_reset(Client_data *client, const IP_Port *ip_port) { - IPPTsPng *ipptp_write = NULL; - IPPTsPng *ipptp_clear = NULL; + IPPTsPng *ipptp_write = nullptr; + IPPTsPng *ipptp_clear = nullptr; if (ip_port->ip.family == TOX_AF_INET) { ipptp_write = &client->assoc4; @@ -888,29 +974,29 @@ static void update_client_with_reset(Client_data *client, const IP_Port *ip_port * and all nodes in the list are closer to comp_public_key * than public_key. * - * returns True(1) when the item was stored, False(0) otherwise */ -static int replace_all(Client_data *list, - uint16_t length, - const uint8_t *public_key, - IP_Port ip_port, - const uint8_t *comp_public_key) + * returns true when the item was stored, false otherwise */ +static bool replace_all(Client_data *list, + uint16_t length, + const uint8_t *public_key, + IP_Port ip_port, + const uint8_t *comp_public_key) { if ((ip_port.ip.family != TOX_AF_INET) && (ip_port.ip.family != TOX_AF_INET6)) { - return 0; + return false; } if (!store_node_ok(&list[1], public_key, comp_public_key) && !store_node_ok(&list[0], public_key, comp_public_key)) { - return 0; + return false; } sort_client_list(list, length, comp_public_key); - Client_data *client = &list[0]; + Client_data *const client = &list[0]; id_copy(client->public_key, public_key); update_client_with_reset(client, &ip_port); - return 1; + return true; } /* Add node to close list. @@ -931,7 +1017,7 @@ static int add_to_close(DHT *dht, const uint8_t *public_key, IP_Port ip_port, bo for (uint32_t i = 0; i < LCLIENT_NODES; ++i) { /* TODO(iphydf): write bounds checking test to catch the case that * index is left as >= LCLIENT_LENGTH */ - Client_data *client = &dht->close_clientlist[(index * LCLIENT_NODES) + i]; + Client_data *const client = &dht->close_clientlist[(index * LCLIENT_NODES) + i]; if (!is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) || !is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT)) { @@ -957,18 +1043,18 @@ bool node_addable_to_close_list(DHT *dht, const uint8_t *public_key, IP_Port ip_ return add_to_close(dht, public_key, ip_port, 1) == 0; } -static bool is_pk_in_client_list(Client_data *list, unsigned int client_list_length, const uint8_t *public_key, +static bool is_pk_in_client_list(const Client_data *list, unsigned int client_list_length, const uint8_t *public_key, IP_Port ip_port) { - uint32_t index = index_of_client_pk(list, client_list_length, public_key); + const uint32_t index = index_of_client_pk(list, client_list_length, public_key); if (index == UINT32_MAX) { return 0; } - const IPPTsPng *assoc = ip_port.ip.family == TOX_AF_INET ? - &list[index].assoc4 : - &list[index].assoc6; + const IPPTsPng *assoc = ip_port.ip.family == TOX_AF_INET + ? &list[index].assoc4 + : &list[index].assoc6; return !is_timeout(assoc->timestamp, BAD_NODE_TIMEOUT); } @@ -987,52 +1073,54 @@ static bool is_pk_in_close_list(DHT *dht, const uint8_t *public_key, IP_Port ip_ /* Check if the node obtained with a get_nodes with public_key should be pinged. * NOTE: for best results call it after addto_lists; * - * return 0 if the node should not be pinged. - * return 1 if it should. + * return false if the node should not be pinged. + * return true if it should. */ -static unsigned int ping_node_from_getnodes_ok(DHT *dht, const uint8_t *public_key, IP_Port ip_port) +static bool ping_node_from_getnodes_ok(DHT *dht, const uint8_t *public_key, IP_Port ip_port) { - bool ret = 0; + bool ret = false; if (add_to_close(dht, public_key, ip_port, 1) == 0) { - ret = 1; + ret = true; } - unsigned int *num = &dht->num_to_bootstrap; - uint32_t index = index_of_node_pk(dht->to_bootstrap, *num, public_key); - bool in_close_list = is_pk_in_close_list(dht, public_key, ip_port); + { + unsigned int *const num = &dht->num_to_bootstrap; + const uint32_t index = index_of_node_pk(dht->to_bootstrap, *num, public_key); + const bool in_close_list = is_pk_in_close_list(dht, public_key, ip_port); - if (ret && index == UINT32_MAX && !in_close_list) { - if (*num < MAX_CLOSE_TO_BOOTSTRAP_NODES) { - memcpy(dht->to_bootstrap[*num].public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE); - dht->to_bootstrap[*num].ip_port = ip_port; - ++*num; - } else { - // TODO(irungentoo): ipv6 vs v4 - add_to_list(dht->to_bootstrap, MAX_CLOSE_TO_BOOTSTRAP_NODES, public_key, ip_port, dht->self_public_key); + if (ret && index == UINT32_MAX && !in_close_list) { + if (*num < MAX_CLOSE_TO_BOOTSTRAP_NODES) { + memcpy(dht->to_bootstrap[*num].public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE); + dht->to_bootstrap[*num].ip_port = ip_port; + ++*num; + } else { + // TODO(irungentoo): ipv6 vs v4 + add_to_list(dht->to_bootstrap, MAX_CLOSE_TO_BOOTSTRAP_NODES, public_key, ip_port, dht->self_public_key); + } } } for (uint32_t i = 0; i < dht->num_friends; ++i) { - bool store_ok = 0; - DHT_Friend *dht_friend = &dht->friends_list[i]; + bool store_ok = false; + if (store_node_ok(&dht_friend->client_list[1], public_key, dht_friend->public_key)) { - store_ok = 1; + store_ok = true; } if (store_node_ok(&dht_friend->client_list[0], public_key, dht_friend->public_key)) { - store_ok = 1; + store_ok = true; } - unsigned int *friend_num = &dht_friend->num_to_bootstrap; + unsigned int *const friend_num = &dht_friend->num_to_bootstrap; const uint32_t index = index_of_node_pk(dht_friend->to_bootstrap, *friend_num, public_key); const bool pk_in_list = is_pk_in_client_list(dht_friend->client_list, MAX_FRIEND_CLIENTS, public_key, ip_port); if (store_ok && index == UINT32_MAX && !pk_in_list) { if (*friend_num < MAX_SENT_NODES) { - Node_format *format = &dht_friend->to_bootstrap[*friend_num]; + Node_format *const format = &dht_friend->to_bootstrap[*friend_num]; memcpy(format->public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE); format->ip_port = ip_port; ++*friend_num; @@ -1040,7 +1128,7 @@ static unsigned int ping_node_from_getnodes_ok(DHT *dht, const uint8_t *public_k add_to_list(dht_friend->to_bootstrap, MAX_SENT_NODES, public_key, ip_port, dht_friend->public_key); } - ret = 1; + ret = true; } } @@ -1057,9 +1145,9 @@ uint32_t addto_lists(DHT *dht, IP_Port ip_port, const uint8_t *public_key) uint32_t used = 0; /* convert IPv4-in-IPv6 to IPv4 */ - if ((ip_port.ip.family == TOX_AF_INET6) && IPV6_IPV4_IN_V6(ip_port.ip.ip6)) { + if ((ip_port.ip.family == TOX_AF_INET6) && IPV6_IPV4_IN_V6(ip_port.ip.ip.v6)) { ip_port.ip.family = TOX_AF_INET; - ip_port.ip.ip4.uint32 = ip_port.ip.ip6.uint32[3]; + ip_port.ip.ip.v4.uint32 = ip_port.ip.ip.v6.uint32[3]; } /* NOTE: Current behavior if there are two clients with the same id is @@ -1073,7 +1161,7 @@ uint32_t addto_lists(DHT *dht, IP_Port ip_port, const uint8_t *public_key) used++; } - DHT_Friend *friend_foundip = 0; + DHT_Friend *friend_foundip = nullptr; for (uint32_t i = 0; i < dht->num_friends; ++i) { const bool in_list = client_or_ip_port_in_list(dht->log, dht->friends_list[i].client_list, @@ -1108,14 +1196,14 @@ uint32_t addto_lists(DHT *dht, IP_Port ip_port, const uint8_t *public_key) static bool update_client_data(Client_data *array, size_t size, IP_Port ip_port, const uint8_t *pk) { - uint64_t temp_time = unix_time(); - uint32_t index = index_of_client_pk(array, size, pk); + const uint64_t temp_time = unix_time(); + const uint32_t index = index_of_client_pk(array, size, pk); if (index == UINT32_MAX) { return false; } - Client_data *data = &array[index]; + Client_data *const data = &array[index]; IPPTsPng *assoc; if (ip_port.ip.family == TOX_AF_INET) { @@ -1137,9 +1225,9 @@ static bool update_client_data(Client_data *array, size_t size, IP_Port ip_port, static void returnedip_ports(DHT *dht, IP_Port ip_port, const uint8_t *public_key, const uint8_t *nodepublic_key) { /* convert IPv4-in-IPv6 to IPv4 */ - if ((ip_port.ip.family == TOX_AF_INET6) && IPV6_IPV4_IN_V6(ip_port.ip.ip6)) { + if ((ip_port.ip.family == TOX_AF_INET6) && IPV6_IPV4_IN_V6(ip_port.ip.ip.v6)) { ip_port.ip.family = TOX_AF_INET; - ip_port.ip.ip4.uint32 = ip_port.ip.ip6.uint32[3]; + ip_port.ip.ip.v4.uint32 = ip_port.ip.ip.v6.uint32[3]; } if (id_equal(public_key, dht->self_public_key)) { @@ -1149,7 +1237,7 @@ static void returnedip_ports(DHT *dht, IP_Port ip_port, const uint8_t *public_ke for (uint32_t i = 0; i < dht->num_friends; ++i) { if (id_equal(public_key, dht->friends_list[i].public_key)) { - Client_data *client_list = dht->friends_list[i].client_list; + Client_data *const client_list = dht->friends_list[i].client_list; if (update_client_data(client_list, MAX_FRIEND_CLIENTS, ip_port, nodepublic_key)) { return; @@ -1177,7 +1265,7 @@ static int getnodes(DHT *dht, IP_Port ip_port, const uint8_t *public_key, const uint64_t ping_id = 0; - if (sendback_node != NULL) { + if (sendback_node != nullptr) { memcpy(plain_message + sizeof(receiver), sendback_node, sizeof(Node_format)); ping_id = ping_array_add(dht->dht_harden_ping_array, plain_message, sizeof(plain_message)); } else { @@ -1197,8 +1285,8 @@ static int getnodes(DHT *dht, IP_Port ip_port, const uint8_t *public_key, const uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE]; DHT_get_shared_key_sent(dht, shared_key, public_key); - int len = DHT_create_packet(dht->self_public_key, shared_key, NET_PACKET_GET_NODES, - plain, sizeof(plain), data); + const int len = DHT_create_packet(dht->self_public_key, shared_key, NET_PACKET_GET_NODES, + plain, sizeof(plain), data); if (len != sizeof(data)) { return -1; @@ -1220,17 +1308,17 @@ static int sendnodes_ipv6(const DHT *dht, IP_Port ip_port, const uint8_t *public return -1; } - size_t Node_format_size = sizeof(Node_format); + const size_t node_format_size = sizeof(Node_format); Node_format nodes_list[MAX_SENT_NODES]; - uint32_t num_nodes = get_close_nodes(dht, client_id, nodes_list, 0, ip_is_lan(ip_port.ip) == 0, 1); + const uint32_t num_nodes = get_close_nodes(dht, client_id, nodes_list, 0, ip_is_lan(ip_port.ip) == 0, 1); - VLA(uint8_t, plain, 1 + Node_format_size * MAX_SENT_NODES + length); + VLA(uint8_t, plain, 1 + node_format_size * MAX_SENT_NODES + length); int nodes_length = 0; if (num_nodes) { - nodes_length = pack_nodes(plain + 1, Node_format_size * MAX_SENT_NODES, nodes_list, num_nodes); + nodes_length = pack_nodes(plain + 1, node_format_size * MAX_SENT_NODES, nodes_list, num_nodes); if (nodes_length <= 0) { return -1; @@ -1243,8 +1331,8 @@ static int sendnodes_ipv6(const DHT *dht, IP_Port ip_port, const uint8_t *public const uint32_t crypto_size = 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE + CRYPTO_MAC_SIZE; VLA(uint8_t, data, 1 + nodes_length + length + crypto_size); - int len = DHT_create_packet(dht->self_public_key, shared_encryption_key, NET_PACKET_SEND_NODES_IPV6, - plain, 1 + nodes_length + length, data); + const int len = DHT_create_packet(dht->self_public_key, shared_encryption_key, NET_PACKET_SEND_NODES_IPV6, + plain, 1 + nodes_length + length, data); if (len != SIZEOF_VLA(data)) { return -1; @@ -1258,41 +1346,42 @@ static int sendnodes_ipv6(const DHT *dht, IP_Port ip_port, const uint8_t *public static int handle_getnodes(void *object, IP_Port source, const uint8_t *packet, uint16_t length, void *userdata) { if (length != (CRYPTO_SIZE + CRYPTO_MAC_SIZE + sizeof(uint64_t))) { - return 1; + return true; } - DHT *dht = (DHT *)object; + DHT *const dht = (DHT *)object; /* Check if packet is from ourself. */ if (id_equal(packet + 1, dht->self_public_key)) { - return 1; + return true; } uint8_t plain[CRYPTO_NODE_SIZE]; uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE]; DHT_get_shared_key_recv(dht, shared_key, packet + 1); - int len = decrypt_data_symmetric( - shared_key, - packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, - packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE, - CRYPTO_NODE_SIZE + CRYPTO_MAC_SIZE, - plain); + const int len = decrypt_data_symmetric( + shared_key, + packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, + packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE, + CRYPTO_NODE_SIZE + CRYPTO_MAC_SIZE, + plain); if (len != CRYPTO_NODE_SIZE) { - return 1; + return true; } sendnodes_ipv6(dht, source, packet + 1, plain, plain + CRYPTO_PUBLIC_KEY_SIZE, sizeof(uint64_t), shared_key); ping_add(dht->ping, packet + 1, source); - return 0; + return false; } -/* return 0 if no - return 1 if yes */ -static uint8_t sent_getnode_to_node(DHT *dht, const uint8_t *public_key, IP_Port node_ip_port, uint64_t ping_id, - Node_format *sendback_node) + +/* return false if no + return true if yes */ +static bool sent_getnode_to_node(DHT *dht, const uint8_t *public_key, IP_Port node_ip_port, uint64_t ping_id, + Node_format *sendback_node) { uint8_t data[sizeof(Node_format) * 2]; @@ -1301,17 +1390,17 @@ static uint8_t sent_getnode_to_node(DHT *dht, const uint8_t *public_key, IP_Port } else if (ping_array_check(dht->dht_harden_ping_array, data, sizeof(data), ping_id) == sizeof(data)) { memcpy(sendback_node, data + sizeof(Node_format), sizeof(Node_format)); } else { - return 0; + return false; } Node_format test; memcpy(&test, data, sizeof(Node_format)); if (!ipport_equal(&test.ip_port, &node_ip_port) || !id_equal(test.public_key, public_key)) { - return 0; + return false; } - return 1; + return true; } /* Function is needed in following functions. */ @@ -1321,14 +1410,14 @@ static int send_hardening_getnode_res(const DHT *dht, const Node_format *sendto, static int handle_sendnodes_core(void *object, IP_Port source, const uint8_t *packet, uint16_t length, Node_format *plain_nodes, uint16_t size_plain_nodes, uint32_t *num_nodes_out) { - DHT *dht = (DHT *)object; - uint32_t cid_size = 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE + 1 + sizeof(uint64_t) + CRYPTO_MAC_SIZE; + DHT *const dht = (DHT *)object; + const uint32_t cid_size = 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE + 1 + sizeof(uint64_t) + CRYPTO_MAC_SIZE; if (length < cid_size) { /* too short */ return 1; } - uint32_t data_size = length - cid_size; + const uint32_t data_size = length - cid_size; if (data_size == 0) { return 1; @@ -1341,12 +1430,12 @@ static int handle_sendnodes_core(void *object, IP_Port source, const uint8_t *pa VLA(uint8_t, plain, 1 + data_size + sizeof(uint64_t)); uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE]; DHT_get_shared_key_sent(dht, shared_key, packet + 1); - int len = decrypt_data_symmetric( - shared_key, - packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, - packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE, - 1 + data_size + sizeof(uint64_t) + CRYPTO_MAC_SIZE, - plain); + const int len = decrypt_data_symmetric( + shared_key, + packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, + packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE, + 1 + data_size + sizeof(uint64_t) + CRYPTO_MAC_SIZE, + plain); if ((unsigned int)len != SIZEOF_VLA(plain)) { return 1; @@ -1366,7 +1455,7 @@ static int handle_sendnodes_core(void *object, IP_Port source, const uint8_t *pa } uint16_t length_nodes = 0; - int num_nodes = unpack_nodes(plain_nodes, plain[0], &length_nodes, plain + 1, data_size, 0); + const int num_nodes = unpack_nodes(plain_nodes, plain[0], &length_nodes, plain + 1, data_size, 0); if (length_nodes != data_size) { return 1; @@ -1391,7 +1480,7 @@ static int handle_sendnodes_core(void *object, IP_Port source, const uint8_t *pa static int handle_sendnodes_ipv6(void *object, IP_Port source, const uint8_t *packet, uint16_t length, void *userdata) { - DHT *dht = (DHT *)object; + DHT *const dht = (DHT *)object; Node_format plain_nodes[MAX_SENT_NODES]; uint32_t num_nodes; @@ -1419,12 +1508,12 @@ static int handle_sendnodes_ipv6(void *object, IP_Port source, const uint8_t *pa int DHT_addfriend(DHT *dht, const uint8_t *public_key, void (*ip_callback)(void *data, int32_t number, IP_Port), void *data, int32_t number, uint16_t *lock_count) { - uint32_t friend_num = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key); + const uint32_t friend_num = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key); uint16_t lock_num; if (friend_num != UINT32_MAX) { /* Is friend already in DHT? */ - DHT_Friend *dht_friend = &dht->friends_list[friend_num]; + DHT_Friend *const dht_friend = &dht->friends_list[friend_num]; if (dht_friend->lock_count == DHT_FRIEND_MAX_LOCKS) { return -1; @@ -1443,14 +1532,14 @@ int DHT_addfriend(DHT *dht, const uint8_t *public_key, void (*ip_callback)(void return 0; } - DHT_Friend *temp = (DHT_Friend *)realloc(dht->friends_list, sizeof(DHT_Friend) * (dht->num_friends + 1)); + DHT_Friend *const temp = (DHT_Friend *)realloc(dht->friends_list, sizeof(DHT_Friend) * (dht->num_friends + 1)); - if (temp == NULL) { + if (temp == nullptr) { return -1; } dht->friends_list = temp; - DHT_Friend *dht_friend = &dht->friends_list[dht->num_friends]; + DHT_Friend *const dht_friend = &dht->friends_list[dht->num_friends]; memset(dht_friend, 0, sizeof(DHT_Friend)); memcpy(dht_friend->public_key, public_key, CRYPTO_PUBLIC_KEY_SIZE); @@ -1474,19 +1563,19 @@ int DHT_addfriend(DHT *dht, const uint8_t *public_key, void (*ip_callback)(void int DHT_delfriend(DHT *dht, const uint8_t *public_key, uint16_t lock_count) { - uint32_t friend_num = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key); + const uint32_t friend_num = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key); if (friend_num == UINT32_MAX) { return -1; } - DHT_Friend *dht_friend = &dht->friends_list[friend_num]; + DHT_Friend *const dht_friend = &dht->friends_list[friend_num]; --dht_friend->lock_count; if (dht_friend->lock_count && lock_count) { /* DHT friend is still in use.*/ --lock_count; - dht_friend->callbacks[lock_count].ip_callback = NULL; - dht_friend->callbacks[lock_count].data = NULL; + dht_friend->callbacks[lock_count].ip_callback = nullptr; + dht_friend->callbacks[lock_count].data = nullptr; dht_friend->callbacks[lock_count].number = 0; return 0; } @@ -1501,13 +1590,13 @@ int DHT_delfriend(DHT *dht, const uint8_t *public_key, uint16_t lock_count) if (dht->num_friends == 0) { free(dht->friends_list); - dht->friends_list = NULL; + dht->friends_list = nullptr; return 0; } - DHT_Friend *temp = (DHT_Friend *)realloc(dht->friends_list, sizeof(DHT_Friend) * (dht->num_friends)); + DHT_Friend *const temp = (DHT_Friend *)realloc(dht->friends_list, sizeof(DHT_Friend) * (dht->num_friends)); - if (temp == NULL) { + if (temp == nullptr) { return -1; } @@ -1521,24 +1610,24 @@ int DHT_getfriendip(const DHT *dht, const uint8_t *public_key, IP_Port *ip_port) ip_reset(&ip_port->ip); ip_port->port = 0; - uint32_t friend_index = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key); + const uint32_t friend_index = index_of_friend_pk(dht->friends_list, dht->num_friends, public_key); if (friend_index == UINT32_MAX) { return -1; } - DHT_Friend *frnd = &dht->friends_list[friend_index]; - uint32_t client_index = index_of_client_pk(frnd->client_list, MAX_FRIEND_CLIENTS, public_key); + DHT_Friend *const frnd = &dht->friends_list[friend_index]; + const uint32_t client_index = index_of_client_pk(frnd->client_list, MAX_FRIEND_CLIENTS, public_key); if (client_index == -1) { return 0; } - Client_data *client = &frnd->client_list[client_index]; - IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 }; + const Client_data *const client = &frnd->client_list[client_index]; + const IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 }; for (size_t i = 0; i < ASSOC_COUNT; i++) { - IPPTsPng *assoc = assocs[i]; + const IPPTsPng *const assoc = assocs[i]; if (!is_timeout(assoc->timestamp, BAD_NODE_TIMEOUT)) { *ip_port = assoc->ip_port; @@ -1554,13 +1643,13 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co Client_data *list, uint32_t list_count, uint32_t *bootstrap_times, bool sortable) { uint8_t not_kill = 0; - uint64_t temp_time = unix_time(); + const uint64_t temp_time = unix_time(); uint32_t num_nodes = 0; VLA(Client_data *, client_list, list_count * 2); VLA(IPPTsPng *, assoc_list, list_count * 2); unsigned int sort = 0; - bool sort_ok = 0; + bool sort_ok = false; for (uint32_t i = 0; i < list_count; i++) { /* If node is not dead. */ @@ -1568,15 +1657,15 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 }; - for (size_t i = 0; i < ASSOC_COUNT; i++) { - IPPTsPng *assoc = assocs[i]; + for (size_t j = 0; j < ASSOC_COUNT; j++) { + IPPTsPng *assoc = assocs[j]; if (!is_timeout(assoc->timestamp, KILL_NODE_TIMEOUT)) { sort = 0; not_kill++; if (is_timeout(assoc->last_pinged, PING_INTERVAL)) { - getnodes(dht, assoc->ip_port, client->public_key, public_key, NULL); + getnodes(dht, assoc->ip_port, client->public_key, public_key, nullptr); assoc->last_pinged = temp_time; } @@ -1590,8 +1679,8 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co ++sort; /* Timed out should be at beginning, if they are not, sort the list. */ - if (sort > 1 && sort < (((i + 1) * 2) - 1)) { - sort_ok = 1; + if (sort > 1 && sort < (((j + 1) * 2) - 1)) { + sort_ok = true; } } } @@ -1602,13 +1691,13 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co } if ((num_nodes != 0) && (is_timeout(*lastgetnode, GET_NODE_INTERVAL) || *bootstrap_times < MAX_BOOTSTRAP_TIMES)) { - uint32_t rand_node = rand() % (num_nodes); + uint32_t rand_node = rand() % num_nodes; if ((num_nodes - 1) != rand_node) { rand_node += rand() % (num_nodes - (rand_node + 1)); } - getnodes(dht, assoc_list[rand_node]->ip_port, client_list[rand_node]->public_key, public_key, NULL); + getnodes(dht, assoc_list[rand_node]->ip_port, client_list[rand_node]->public_key, public_key, nullptr); *lastgetnode = temp_time; ++*bootstrap_times; @@ -1623,11 +1712,11 @@ static uint8_t do_ping_and_sendnode_requests(DHT *dht, uint64_t *lastgetnode, co static void do_DHT_friends(DHT *dht) { for (size_t i = 0; i < dht->num_friends; ++i) { - DHT_Friend *dht_friend = &dht->friends_list[i]; + DHT_Friend *const dht_friend = &dht->friends_list[i]; for (size_t j = 0; j < dht_friend->num_to_bootstrap; ++j) { getnodes(dht, dht_friend->to_bootstrap[j].ip_port, dht_friend->to_bootstrap[j].public_key, dht_friend->public_key, - NULL); + nullptr); } dht_friend->num_to_bootstrap = 0; @@ -1644,34 +1733,37 @@ static void do_DHT_friends(DHT *dht) static void do_Close(DHT *dht) { for (size_t i = 0; i < dht->num_to_bootstrap; ++i) { - getnodes(dht, dht->to_bootstrap[i].ip_port, dht->to_bootstrap[i].public_key, dht->self_public_key, NULL); + getnodes(dht, dht->to_bootstrap[i].ip_port, dht->to_bootstrap[i].public_key, dht->self_public_key, nullptr); } dht->num_to_bootstrap = 0; - uint8_t not_killed = do_ping_and_sendnode_requests(dht, &dht->close_lastgetnodes, dht->self_public_key, - dht->close_clientlist, LCLIENT_LIST, &dht->close_bootstrap_times, 0); + uint8_t not_killed = do_ping_and_sendnode_requests( + dht, &dht->close_lastgetnodes, dht->self_public_key, dht->close_clientlist, LCLIENT_LIST, &dht->close_bootstrap_times, + 0); + + if (not_killed != 0) { + return; + } - if (!not_killed) { - /* all existing nodes are at least KILL_NODE_TIMEOUT, - * which means we are mute, as we only send packets to - * nodes NOT in KILL_NODE_TIMEOUT - * - * so: reset all nodes to be BAD_NODE_TIMEOUT, but not - * KILL_NODE_TIMEOUT, so we at least keep trying pings */ - uint64_t badonly = unix_time() - BAD_NODE_TIMEOUT; + /* all existing nodes are at least KILL_NODE_TIMEOUT, + * which means we are mute, as we only send packets to + * nodes NOT in KILL_NODE_TIMEOUT + * + * so: reset all nodes to be BAD_NODE_TIMEOUT, but not + * KILL_NODE_TIMEOUT, so we at least keep trying pings */ + const uint64_t badonly = unix_time() - BAD_NODE_TIMEOUT; - for (size_t i = 0; i < LCLIENT_LIST; i++) { - Client_data *client = &dht->close_clientlist[i]; + for (size_t i = 0; i < LCLIENT_LIST; i++) { + Client_data *const client = &dht->close_clientlist[i]; - IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 }; + IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 }; - for (size_t j = 0; j < ASSOC_COUNT; j++) { - IPPTsPng *assoc = assocs[j]; + for (size_t j = 0; j < ASSOC_COUNT; j++) { + IPPTsPng *const assoc = assocs[j]; - if (assoc->timestamp) { - assoc->timestamp = badonly; - } + if (assoc->timestamp) { + assoc->timestamp = badonly; } } } @@ -1679,18 +1771,18 @@ static void do_Close(DHT *dht) void DHT_getnodes(DHT *dht, const IP_Port *from_ipp, const uint8_t *from_id, const uint8_t *which_id) { - getnodes(dht, *from_ipp, from_id, which_id, NULL); + getnodes(dht, *from_ipp, from_id, which_id, nullptr); } void DHT_bootstrap(DHT *dht, IP_Port ip_port, const uint8_t *public_key) { - getnodes(dht, ip_port, public_key, dht->self_public_key, NULL); + getnodes(dht, ip_port, public_key, dht->self_public_key, nullptr); } int DHT_bootstrap_from_address(DHT *dht, const char *address, uint8_t ipv6enabled, uint16_t port, const uint8_t *public_key) { IP_Port ip_port_v64; - IP *ip_extra = NULL; + IP *ip_extra = nullptr; IP_Port ip_port_v4; ip_init(&ip_port_v64.ip, ipv6enabled); @@ -1705,7 +1797,7 @@ int DHT_bootstrap_from_address(DHT *dht, const char *address, uint8_t ipv6enable ip_port_v64.port = port; DHT_bootstrap(dht, ip_port_v64, public_key); - if ((ip_extra != NULL) && ip_isset(ip_extra)) { + if ((ip_extra != nullptr) && ip_isset(ip_extra)) { ip_port_v4.port = port; DHT_bootstrap(dht, ip_port_v4, public_key); } @@ -1724,11 +1816,11 @@ int route_packet(const DHT *dht, const uint8_t *public_key, const uint8_t *packe { for (uint32_t i = 0; i < LCLIENT_LIST; ++i) { if (id_equal(public_key, dht->close_clientlist[i].public_key)) { - const Client_data *client = &dht->close_clientlist[i]; - const IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 }; + const Client_data *const client = &dht->close_clientlist[i]; + const IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc6, &client->assoc4 }; for (size_t j = 0; j < ASSOC_COUNT; j++) { - const IPPTsPng *assoc = assocs[j]; + const IPPTsPng *const assoc = assocs[j]; if (ip_isset(&assoc->ip_port.ip)) { return sendpacket(dht->net, assoc->ip_port, packet, length); @@ -1755,15 +1847,14 @@ static int friend_iplist(const DHT *dht, IP_Port *ip_portlist, uint16_t friend_n return -1; } - DHT_Friend *dht_friend = &dht->friends_list[friend_num]; - Client_data *client; + const DHT_Friend *const dht_friend = &dht->friends_list[friend_num]; IP_Port ipv4s[MAX_FRIEND_CLIENTS]; int num_ipv4s = 0; IP_Port ipv6s[MAX_FRIEND_CLIENTS]; int num_ipv6s = 0; for (size_t i = 0; i < MAX_FRIEND_CLIENTS; ++i) { - client = &dht_friend->client_list[i]; + const Client_data *const client = &dht_friend->client_list[i]; /* If ip is not zero and node is good. */ if (ip_isset(&client->assoc4.ret_ip_port.ip) && !is_timeout(client->assoc4.ret_timestamp, BAD_NODE_TIMEOUT)) { @@ -1824,7 +1915,7 @@ static int friend_iplist(const DHT *dht, IP_Port *ip_portlist, uint16_t friend_n */ int route_tofriend(const DHT *dht, const uint8_t *friend_id, const uint8_t *packet, uint16_t length) { - uint32_t num = index_of_friend_pk(dht->friends_list, dht->num_friends, friend_id); + const uint32_t num = index_of_friend_pk(dht->friends_list, dht->num_friends, friend_id); if (num == UINT32_MAX) { return 0; @@ -1834,14 +1925,13 @@ int route_tofriend(const DHT *dht, const uint8_t *friend_id, const uint8_t *pack uint8_t friend_sent[MAX_FRIEND_CLIENTS] = {0}; IP_Port ip_list[MAX_FRIEND_CLIENTS]; - int ip_num = friend_iplist(dht, ip_list, num); + const int ip_num = friend_iplist(dht, ip_list, num); if (ip_num < (MAX_FRIEND_CLIENTS / 4)) { return 0; /* Reason for that? */ } - DHT_Friend *dht_friend = &dht->friends_list[num]; - Client_data *client; + const DHT_Friend *const dht_friend = &dht->friends_list[num]; /* extra legwork, because having the outside allocating the space for us * is *usually* good(tm) (bites us in the behind in this case though) */ @@ -1851,16 +1941,15 @@ int route_tofriend(const DHT *dht, const uint8_t *friend_id, const uint8_t *pack continue; } - client = &dht_friend->client_list[i]; - - const IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc4, &client->assoc6 }; + const Client_data *const client = &dht_friend->client_list[i]; + const IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc4, &client->assoc6 }; for (size_t j = 0; j < ASSOC_COUNT; j++) { - const IPPTsPng *assoc = assocs[j]; + const IPPTsPng *const assoc = assocs[j]; /* If ip is not zero and node is good. */ if (ip_isset(&assoc->ret_ip_port.ip) && !is_timeout(assoc->ret_timestamp, BAD_NODE_TIMEOUT)) { - int retval = sendpacket(dht->net, assoc->ip_port, packet, length); + const int retval = sendpacket(dht->net, assoc->ip_port, packet, length); if ((unsigned int)retval == length) { ++sent; @@ -1879,14 +1968,13 @@ int route_tofriend(const DHT *dht, const uint8_t *friend_id, const uint8_t *pack */ static int routeone_tofriend(DHT *dht, const uint8_t *friend_id, const uint8_t *packet, uint16_t length) { - uint32_t num = index_of_friend_pk(dht->friends_list, dht->num_friends, friend_id); + const uint32_t num = index_of_friend_pk(dht->friends_list, dht->num_friends, friend_id); if (num == UINT32_MAX) { return 0; } - DHT_Friend *dht_friend = &dht->friends_list[num]; - Client_data *client; + const DHT_Friend *const dht_friend = &dht->friends_list[num]; IP_Port ip_list[MAX_FRIEND_CLIENTS * 2]; int n = 0; @@ -1895,9 +1983,8 @@ static int routeone_tofriend(DHT *dht, const uint8_t *friend_id, const uint8_t * * is *usually* good(tm) (bites us in the behind in this case though) */ for (uint32_t i = 0; i < MAX_FRIEND_CLIENTS; ++i) { - client = &dht_friend->client_list[i]; - - const IPPTsPng *assocs[ASSOC_COUNT] = { &client->assoc4, &client->assoc6 }; + const Client_data *const client = &dht_friend->client_list[i]; + const IPPTsPng *const assocs[ASSOC_COUNT] = { &client->assoc4, &client->assoc6 }; for (size_t j = 0; j < ASSOC_COUNT; j++) { const IPPTsPng *assoc = assocs[j]; @@ -1914,7 +2001,7 @@ static int routeone_tofriend(DHT *dht, const uint8_t *friend_id, const uint8_t * return 0; } - int retval = sendpacket(dht->net, ip_list[rand() % n], packet, length); + const int retval = sendpacket(dht->net, ip_list[rand() % n], packet, length); if ((unsigned int)retval == length) { return 1; @@ -1936,8 +2023,9 @@ static int send_NATping(DHT *dht, const uint8_t *public_key, uint64_t ping_id, u data[0] = type; memcpy(data + 1, &ping_id, sizeof(uint64_t)); /* 254 is NAT ping request packet id */ - int len = create_request(dht->self_public_key, dht->self_secret_key, packet, public_key, data, - sizeof(uint64_t) + 1, CRYPTO_PACKET_NAT_PING); + const int len = create_request( + dht->self_public_key, dht->self_secret_key, packet, public_key, data, + sizeof(uint64_t) + 1, CRYPTO_PACKET_NAT_PING); if (len == -1) { return -1; @@ -1964,7 +2052,7 @@ static int handle_NATping(void *object, IP_Port source, const uint8_t *source_pu return 1; } - DHT *dht = (DHT *)object; + DHT *const dht = (DHT *)object; uint64_t ping_id; memcpy(&ping_id, packet + 1, sizeof(uint64_t)); @@ -1974,7 +2062,7 @@ static int handle_NATping(void *object, IP_Port source, const uint8_t *source_pu return 1; } - DHT_Friend *dht_friend = &dht->friends_list[friendnumber]; + DHT_Friend *const dht_friend = &dht->friends_list[friendnumber]; if (packet[0] == NAT_PING_REQUEST) { /* 1 is reply */ @@ -2056,7 +2144,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports, return; } - uint16_t first_port = port_list[0]; + const uint16_t first_port = port_list[0]; uint32_t i; for (i = 0; i < numports; ++i) { @@ -2073,11 +2161,11 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports, } else { for (i = 0; i < MAX_PUNCHING_PORTS; ++i) { /* TODO(irungentoo): Improve port guessing algorithm. */ - uint32_t it = i + dht->friends_list[friend_num].nat.punching_index; - int8_t sign = (it % 2) ? -1 : 1; - uint32_t delta = sign * (it / (2 * numports)); - uint32_t index = (it / 2) % numports; - uint16_t port = port_list[index] + delta; + const uint32_t it = i + dht->friends_list[friend_num].nat.punching_index; + const int8_t sign = (it % 2) ? -1 : 1; + const uint32_t delta = sign * (it / (2 * numports)); + const uint32_t index = (it / 2) % numports; + const uint16_t port = port_list[index] + delta; IP_Port pinging; ip_copy(&pinging.ip, &ip); pinging.port = net_htons(port); @@ -2088,7 +2176,7 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports, } if (dht->friends_list[friend_num].nat.tries > MAX_NORMAL_PUNCHING_TRIES) { - uint16_t port = 1024; + const uint16_t port = 1024; IP_Port pinging; ip_copy(&pinging.ip, &ip); @@ -2106,11 +2194,11 @@ static void punch_holes(DHT *dht, IP ip, uint16_t *port_list, uint16_t numports, static void do_NAT(DHT *dht) { - uint64_t temp_time = unix_time(); + const uint64_t temp_time = unix_time(); for (uint32_t i = 0; i < dht->num_friends; ++i) { IP_Port ip_list[MAX_FRIEND_CLIENTS]; - int num = friend_iplist(dht, ip_list, i); + const int num = friend_iplist(dht, ip_list, i); /* If already connected or friend is not online don't try to hole punch. */ if (num < MAX_FRIEND_CLIENTS / 2) { @@ -2126,7 +2214,7 @@ static void do_NAT(DHT *dht) dht->friends_list[i].nat.punching_timestamp + PUNCH_INTERVAL < temp_time && dht->friends_list[i].nat.recvNATping_timestamp + PUNCH_INTERVAL * 2 >= temp_time) { - IP ip = NAT_commonip(ip_list, num, MAX_FRIEND_CLIENTS / 2); + const IP ip = NAT_commonip(ip_list, num, MAX_FRIEND_CLIENTS / 2); if (!ip_isset(&ip)) { continue; @@ -2139,7 +2227,7 @@ static void do_NAT(DHT *dht) } uint16_t port_list[MAX_FRIEND_CLIENTS]; - uint16_t numports = NAT_getports(port_list, ip_list, num, ip); + const uint16_t numports = NAT_getports(port_list, ip_list, num, ip); punch_holes(dht, ip, port_list, numports, i); dht->friends_list[i].nat.punching_timestamp = temp_time; @@ -2151,14 +2239,17 @@ static void do_NAT(DHT *dht) /*----------------------------------------------------------------------------------*/ /*-----------------------END OF NAT PUNCHING FUNCTIONS------------------------------*/ +#define DHT_HARDENING 0 #define HARDREQ_DATA_SIZE 384 /* Attempt to prevent amplification/other attacks*/ -#define CHECK_TYPE_ROUTE_REQ 0 -#define CHECK_TYPE_ROUTE_RES 1 -#define CHECK_TYPE_GETNODE_REQ 2 -#define CHECK_TYPE_GETNODE_RES 3 -#define CHECK_TYPE_TEST_REQ 4 -#define CHECK_TYPE_TEST_RES 5 +enum { + CHECK_TYPE_ROUTE_REQ = 0, + CHECK_TYPE_ROUTE_RES = 1, + CHECK_TYPE_GETNODE_REQ = 2, + CHECK_TYPE_GETNODE_RES = 3, + CHECK_TYPE_TEST_REQ = 4, + CHECK_TYPE_TEST_RES = 5, +}; #if DHT_HARDENING static int send_hardening_req(DHT *dht, Node_format *sendto, uint8_t type, uint8_t *contents, uint16_t length) @@ -2171,8 +2262,9 @@ static int send_hardening_req(DHT *dht, Node_format *sendto, uint8_t type, uint8 uint8_t data[HARDREQ_DATA_SIZE] = {0}; data[0] = type; memcpy(data + 1, contents, length); - int len = create_request(dht->self_public_key, dht->self_secret_key, packet, sendto->public_key, data, - sizeof(data), CRYPTO_PACKET_HARDENING); + const int len = create_request( + dht->self_public_key, dht->self_secret_key, packet, sendto->public_key, + data, sizeof(data), CRYPTO_PACKET_HARDENING); if (len == -1) { return -1; @@ -2204,8 +2296,9 @@ static int send_hardening_getnode_res(const DHT *dht, const Node_format *sendto, data[0] = CHECK_TYPE_GETNODE_RES; memcpy(data + 1, queried_client_id, CRYPTO_PUBLIC_KEY_SIZE); memcpy(data + 1 + CRYPTO_PUBLIC_KEY_SIZE, nodes_data, nodes_data_length); - int len = create_request(dht->self_public_key, dht->self_secret_key, packet, sendto->public_key, data, - SIZEOF_VLA(data), CRYPTO_PACKET_HARDENING); + const int len = create_request( + dht->self_public_key, dht->self_secret_key, packet, sendto->public_key, + data, SIZEOF_VLA(data), CRYPTO_PACKET_HARDENING); if (len == -1) { return -1; @@ -2231,7 +2324,7 @@ static IPPTsPng *get_closelist_IPPTsPng(DHT *dht, const uint8_t *public_key, Fam } } - return NULL; + return nullptr; } /* @@ -2248,7 +2341,7 @@ static uint32_t have_nodes_closelist(DHT *dht, Node_format *nodes, uint16_t num) continue; } - IPPTsPng *temp = get_closelist_IPPTsPng(dht, nodes[i].public_key, nodes[i].ip_port.ip.family); + const IPPTsPng *const temp = get_closelist_IPPTsPng(dht, nodes[i].public_key, nodes[i].ip_port.ip.family); if (temp) { if (!is_timeout(temp->timestamp, BAD_NODE_TIMEOUT)) { @@ -2262,13 +2355,12 @@ static uint32_t have_nodes_closelist(DHT *dht, Node_format *nodes, uint16_t num) /* Interval in seconds between hardening checks */ #define HARDENING_INTERVAL 120 -#define HARDEN_TIMEOUT 1200 /* Handle a received hardening packet */ static int handle_hardening(void *object, IP_Port source, const uint8_t *source_pubkey, const uint8_t *packet, uint16_t length, void *userdata) { - DHT *dht = (DHT *)object; + DHT *const dht = (DHT *)object; if (length < 2) { return 1; @@ -2303,7 +2395,8 @@ static int handle_hardening(void *object, IP_Port source, const uint8_t *source_ uint16_t length_nodes = length - 1 - CRYPTO_PUBLIC_KEY_SIZE; Node_format nodes[MAX_SENT_NODES]; - int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, 0, packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, length_nodes, 0); + const int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, nullptr, packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, + length_nodes, 0); /* TODO(irungentoo): MAX_SENT_NODES nodes should be returned at all times (right now we have a small network size so it could cause problems for testing and etc..) */ @@ -2316,9 +2409,9 @@ static int handle_hardening(void *object, IP_Port source, const uint8_t *source_ return 1; } - IPPTsPng *temp = get_closelist_IPPTsPng(dht, packet + 1, nodes[0].ip_port.ip.family); + IPPTsPng *const temp = get_closelist_IPPTsPng(dht, packet + 1, nodes[0].ip_port.ip.family); - if (temp == NULL) { + if (temp == nullptr) { return 1; } @@ -2340,6 +2433,8 @@ static int handle_hardening(void *object, IP_Port source, const uint8_t *source_ } #if DHT_HARDENING +#define HARDEN_TIMEOUT 1200 + /* Return a random node from all the nodes we are connected to. * TODO(irungentoo): improve this function. */ @@ -2348,13 +2443,13 @@ static Node_format random_node(DHT *dht, Family sa_family) uint8_t id[CRYPTO_PUBLIC_KEY_SIZE]; for (uint32_t i = 0; i < CRYPTO_PUBLIC_KEY_SIZE / 4; ++i) { /* populate the id with pseudorandom bytes.*/ - uint32_t t = rand(); + const uint32_t t = rand(); memcpy(id + i * sizeof(t), &t, sizeof(t)); } Node_format nodes_list[MAX_SENT_NODES]; memset(nodes_list, 0, sizeof(nodes_list)); - uint32_t num_nodes = get_close_nodes(dht, id, nodes_list, sa_family, 1, 0); + const uint32_t num_nodes = get_close_nodes(dht, id, nodes_list, sa_family, 1, 0); if (num_nodes == 0) { return nodes_list[0]; @@ -2377,21 +2472,21 @@ static uint16_t list_nodes(Client_data *list, size_t length, Node_format *nodes, uint16_t count = 0; for (size_t i = length; i != 0; --i) { - IPPTsPng *assoc = NULL; + const IPPTsPng *assoc = nullptr; if (!is_timeout(list[i - 1].assoc4.timestamp, BAD_NODE_TIMEOUT)) { assoc = &list[i - 1].assoc4; } if (!is_timeout(list[i - 1].assoc6.timestamp, BAD_NODE_TIMEOUT)) { - if (assoc == NULL) { + if (assoc == nullptr) { assoc = &list[i - 1].assoc6; } else if (rand() % 2) { assoc = &list[i - 1].assoc6; } } - if (assoc != NULL) { + if (assoc != nullptr) { memcpy(nodes[count].public_key, list[i - 1].public_key, CRYPTO_PUBLIC_KEY_SIZE); nodes[count].ip_port = assoc->ip_port; ++count; @@ -2416,7 +2511,7 @@ uint16_t randfriends_nodes(DHT *dht, Node_format *nodes, uint16_t max_num) } uint16_t count = 0; - unsigned int r = rand(); + const unsigned int r = rand(); for (size_t i = 0; i < DHT_FAKE_FRIEND_NUMBER; ++i) { count += list_nodes(dht->friends_list[(i + r) % DHT_FAKE_FRIEND_NUMBER].client_list, MAX_FRIEND_CLIENTS, nodes + count, @@ -2443,9 +2538,9 @@ uint16_t closelist_nodes(DHT *dht, Node_format *nodes, uint16_t max_num) static void do_hardening(DHT *dht) { for (uint32_t i = 0; i < LCLIENT_LIST * 2; ++i) { - IPPTsPng *cur_iptspng; + IPPTsPng *cur_iptspng; Family sa_family; - uint8_t *public_key = dht->close_clientlist[i / 2].public_key; + const uint8_t *const public_key = dht->close_clientlist[i / 2].public_key; if (i % 2 == 0) { cur_iptspng = &dht->close_clientlist[i / 2].assoc4; @@ -2502,7 +2597,7 @@ void cryptopacket_registerhandler(DHT *dht, uint8_t byte, cryptopacket_handler_c static int cryptopacket_handle(void *object, IP_Port source, const uint8_t *packet, uint16_t length, void *userdata) { - DHT *dht = (DHT *)object; + DHT *const dht = (DHT *)object; assert(packet[0] == NET_PACKET_CRYPTO); @@ -2516,7 +2611,8 @@ static int cryptopacket_handle(void *object, IP_Port source, const uint8_t *pack uint8_t public_key[CRYPTO_PUBLIC_KEY_SIZE]; uint8_t data[MAX_CRYPTO_REQUEST_SIZE]; uint8_t number; - int len = handle_request(dht->self_public_key, dht->self_secret_key, public_key, data, &number, packet, length); + const int len = handle_request(dht->self_public_key, dht->self_secret_key, public_key, + data, &number, packet, length); if (len == -1 || len == 0) { return 1; @@ -2526,12 +2622,13 @@ static int cryptopacket_handle(void *object, IP_Port source, const uint8_t *pack return 1; } - return dht->cryptopackethandlers[number].function(dht->cryptopackethandlers[number].object, source, public_key, - data, len, userdata); + return dht->cryptopackethandlers[number].function( + dht->cryptopackethandlers[number].object, source, public_key, + data, len, userdata); } /* If request is not for us, try routing it. */ - int retval = route_packet(dht, packet + 1, packet, length); + const int retval = route_packet(dht, packet + 1, packet, length); if ((unsigned int)retval == length) { return 0; @@ -2547,14 +2644,14 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled) /* init time */ unix_time_update(); - if (net == NULL) { - return NULL; + if (net == nullptr) { + return nullptr; } - DHT *dht = (DHT *)calloc(1, sizeof(DHT)); + DHT *const dht = (DHT *)calloc(1, sizeof(DHT)); - if (dht == NULL) { - return NULL; + if (dht == nullptr) { + return nullptr; } dht->log = log; @@ -2564,9 +2661,9 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled) dht->ping = ping_new(dht); - if (dht->ping == NULL) { + if (dht->ping == nullptr) { kill_DHT(dht); - return NULL; + return nullptr; } networking_registerhandler(dht->net, NET_PACKET_GET_NODES, &handle_getnodes, dht); @@ -2575,7 +2672,6 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled) cryptopacket_registerhandler(dht, CRYPTO_PACKET_NAT_PING, &handle_NATping, dht); cryptopacket_registerhandler(dht, CRYPTO_PACKET_HARDENING, &handle_hardening, dht); - new_symmetric_key(dht->secret_symmetric_key); crypto_new_keypair(dht->self_public_key, dht->self_secret_key); dht->dht_ping_array = ping_array_new(DHT_PING_ARRAY_SIZE, PING_TIMEOUT); @@ -2585,9 +2681,9 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled) uint8_t random_key_bytes[CRYPTO_PUBLIC_KEY_SIZE]; random_bytes(random_key_bytes, sizeof(random_key_bytes)); - if (DHT_addfriend(dht, random_key_bytes, 0, 0, 0, 0) != 0) { + if (DHT_addfriend(dht, random_key_bytes, nullptr, nullptr, 0, nullptr) != 0) { kill_DHT(dht); - return NULL; + return nullptr; } } @@ -2616,12 +2712,13 @@ void do_DHT(DHT *dht) #endif dht->last_run = unix_time(); } + void kill_DHT(DHT *dht) { - networking_registerhandler(dht->net, NET_PACKET_GET_NODES, NULL, NULL); - networking_registerhandler(dht->net, NET_PACKET_SEND_NODES_IPV6, NULL, NULL); - cryptopacket_registerhandler(dht, CRYPTO_PACKET_NAT_PING, NULL, NULL); - cryptopacket_registerhandler(dht, CRYPTO_PACKET_HARDENING, NULL, NULL); + networking_registerhandler(dht->net, NET_PACKET_GET_NODES, nullptr, nullptr); + networking_registerhandler(dht->net, NET_PACKET_SEND_NODES_IPV6, nullptr, nullptr); + cryptopacket_registerhandler(dht, CRYPTO_PACKET_NAT_PING, nullptr, nullptr); + cryptopacket_registerhandler(dht, CRYPTO_PACKET_HARDENING, nullptr, nullptr); ping_array_kill(dht->dht_ping_array); ping_array_kill(dht->dht_harden_ping_array); ping_kill(dht->ping); @@ -2642,7 +2739,8 @@ void kill_DHT(DHT *dht) /* Get the size of the DHT (for saving). */ uint32_t DHT_size(const DHT *dht) { - uint32_t numv4 = 0, numv6 = 0; + uint32_t numv4 = 0; + uint32_t numv6 = 0; for (uint32_t i = 0; i < LCLIENT_LIST; ++i) { numv4 += (dht->close_clientlist[i].assoc4.timestamp != 0); @@ -2650,7 +2748,7 @@ uint32_t DHT_size(const DHT *dht) } for (uint32_t i = 0; i < DHT_FAKE_FRIEND_NUMBER && i < dht->num_friends; ++i) { - DHT_Friend *fr = &dht->friends_list[i]; + const DHT_Friend *const fr = &dht->friends_list[i]; for (uint32_t j = 0; j < MAX_FRIEND_CLIENTS; ++j) { numv4 += (fr->client_list[j].assoc4.timestamp != 0); @@ -2658,7 +2756,8 @@ uint32_t DHT_size(const DHT *dht) } } - uint32_t size32 = sizeof(uint32_t), sizesubhead = size32 * 2; + const uint32_t size32 = sizeof(uint32_t); + const uint32_t sizesubhead = size32 * 2; return size32 + sizesubhead + (packed_node_size(TOX_AF_INET) * numv4) + (packed_node_size(TOX_AF_INET6) * numv6); } @@ -2674,12 +2773,12 @@ static uint8_t *DHT_save_subheader(uint8_t *data, uint32_t len, uint16_t type) /* Save the DHT in data where data is an array of size DHT_size(). */ -void DHT_save(DHT *dht, uint8_t *data) +void DHT_save(const DHT *dht, uint8_t *data) { host_to_lendian32(data, DHT_STATE_COOKIE_GLOBAL); data += sizeof(uint32_t); - uint8_t *old_data = data; + uint8_t *const old_data = data; /* get right offset. we write the actual header later. */ data = DHT_save_subheader(data, 0, 0); @@ -2703,7 +2802,7 @@ void DHT_save(DHT *dht, uint8_t *data) } for (uint32_t i = 0; i < DHT_FAKE_FRIEND_NUMBER && i < dht->num_friends; ++i) { - DHT_Friend *fr = &dht->friends_list[i]; + const DHT_Friend *const fr = &dht->friends_list[i]; for (uint32_t j = 0; j < MAX_FRIEND_CLIENTS; ++j) { if (fr->client_list[j].assoc4.timestamp != 0) { @@ -2729,7 +2828,7 @@ void DHT_save(DHT *dht, uint8_t *data) /* Start sending packets after DHT loaded_friends_list and loaded_clients_list are set */ int DHT_connect_after_load(DHT *dht) { - if (dht == NULL) { + if (dht == nullptr) { return -1; } @@ -2740,13 +2839,13 @@ int DHT_connect_after_load(DHT *dht) /* DHT is connected, stop. */ if (DHT_non_lan_connected(dht)) { free(dht->loaded_nodes_list); - dht->loaded_nodes_list = NULL; + dht->loaded_nodes_list = nullptr; dht->loaded_num_nodes = 0; return 0; } for (uint32_t i = 0; i < dht->loaded_num_nodes && i < SAVE_BOOTSTAP_FREQUENCY; ++i) { - unsigned int index = dht->loaded_nodes_index % dht->loaded_num_nodes; + const unsigned int index = dht->loaded_nodes_index % dht->loaded_num_nodes; DHT_bootstrap(dht, dht->loaded_nodes_list[index].ip_port, dht->loaded_nodes_list[index].public_key); ++dht->loaded_nodes_index; } @@ -2759,26 +2858,25 @@ static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t le DHT *dht = (DHT *)outer; switch (type) { - case DHT_STATE_TYPE_NODES: + case DHT_STATE_TYPE_NODES: { if (length == 0) { break; } - { - free(dht->loaded_nodes_list); - // Copy to loaded_clients_list - dht->loaded_nodes_list = (Node_format *)calloc(MAX_SAVED_DHT_NODES, sizeof(Node_format)); + free(dht->loaded_nodes_list); + // Copy to loaded_clients_list + dht->loaded_nodes_list = (Node_format *)calloc(MAX_SAVED_DHT_NODES, sizeof(Node_format)); - int num = unpack_nodes(dht->loaded_nodes_list, MAX_SAVED_DHT_NODES, NULL, data, length, 0); + const int num = unpack_nodes(dht->loaded_nodes_list, MAX_SAVED_DHT_NODES, nullptr, data, length, 0); - if (num > 0) { - dht->loaded_num_nodes = num; - } else { - dht->loaded_num_nodes = 0; - } - } /* localize declarations */ + if (num > 0) { + dht->loaded_num_nodes = num; + } else { + dht->loaded_num_nodes = 0; + } break; + } default: LOGGER_ERROR(dht->log, "Load state (DHT): contains unrecognized part (len %u, type %u)\n", @@ -2796,7 +2894,7 @@ static int dht_load_state_callback(void *outer, const uint8_t *data, uint32_t le */ int DHT_load(DHT *dht, const uint8_t *data, uint32_t length) { - uint32_t cookie_len = sizeof(uint32_t); + const uint32_t cookie_len = sizeof(uint32_t); if (length > cookie_len) { uint32_t data32; @@ -2811,43 +2909,43 @@ int DHT_load(DHT *dht, const uint8_t *data, uint32_t length) return -1; } -/* return 0 if we are not connected to the DHT. - * return 1 if we are. +/* return false if we are not connected to the DHT. + * return true if we are. */ -int DHT_isconnected(const DHT *dht) +bool DHT_isconnected(const DHT *dht) { unix_time_update(); for (uint32_t i = 0; i < LCLIENT_LIST; ++i) { - const Client_data *client = &dht->close_clientlist[i]; + const Client_data *const client = &dht->close_clientlist[i]; if (!is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) || !is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT)) { - return 1; + return true; } } - return 0; + return false; } -/* return 0 if we are not connected or only connected to lan peers with the DHT. - * return 1 if we are. +/* return false if we are not connected or only connected to lan peers with the DHT. + * return true if we are. */ -int DHT_non_lan_connected(const DHT *dht) +bool DHT_non_lan_connected(const DHT *dht) { unix_time_update(); for (uint32_t i = 0; i < LCLIENT_LIST; ++i) { - const Client_data *client = &dht->close_clientlist[i]; + const Client_data *const client = &dht->close_clientlist[i]; if (!is_timeout(client->assoc4.timestamp, BAD_NODE_TIMEOUT) && ip_is_lan(client->assoc4.ip_port.ip) == -1) { - return 1; + return true; } if (!is_timeout(client->assoc6.timestamp, BAD_NODE_TIMEOUT) && ip_is_lan(client->assoc6.ip_port.ip) == -1) { - return 1; + return true; } } - return 0; + return false; } diff --git a/protocols/Tox/libtox/src/toxcore/DHT.h b/protocols/Tox/libtox/src/toxcore/DHT.h index 8fdd80b04d..284aa8c02f 100644 --- a/protocols/Tox/libtox/src/toxcore/DHT.h +++ b/protocols/Tox/libtox/src/toxcore/DHT.h @@ -240,42 +240,22 @@ typedef struct { } Cryptopacket_Handles; #define DHT_DEFINED -typedef struct DHT { - Logger *log; - Networking_Core *net; +typedef struct DHT DHT; - bool hole_punching_enabled; +const uint8_t *dht_get_self_public_key(const DHT *dht); +const uint8_t *dht_get_self_secret_key(const DHT *dht); +void dht_set_self_public_key(DHT *dht, const uint8_t *key); +void dht_set_self_secret_key(DHT *dht, const uint8_t *key); - Client_data close_clientlist[LCLIENT_LIST]; - uint64_t close_lastgetnodes; - uint32_t close_bootstrap_times; +Networking_Core *dht_get_net(const DHT *dht); +struct Ping *dht_get_ping(const DHT *dht); +const Client_data *dht_get_close_clientlist(const DHT *dht); +const Client_data *dht_get_close_client(const DHT *dht, uint32_t client_num); +uint16_t dht_get_num_friends(const DHT *dht); - /* Note: this key should not be/is not used to transmit any sensitive materials */ - uint8_t secret_symmetric_key[CRYPTO_SYMMETRIC_KEY_SIZE]; - /* DHT keypair */ - uint8_t self_public_key[CRYPTO_PUBLIC_KEY_SIZE]; - uint8_t self_secret_key[CRYPTO_SECRET_KEY_SIZE]; +DHT_Friend *dht_get_friend(DHT *dht, uint32_t friend_num); +const uint8_t *dht_get_friend_public_key(const DHT *dht, uint32_t friend_num); - DHT_Friend *friends_list; - uint16_t num_friends; - - Node_format *loaded_nodes_list; - uint32_t loaded_num_nodes; - unsigned int loaded_nodes_index; - - Shared_Keys shared_keys_recv; - Shared_Keys shared_keys_sent; - - struct Ping *ping; - Ping_Array *dht_ping_array; - Ping_Array *dht_harden_ping_array; - uint64_t last_run; - - Cryptopacket_Handles cryptopackethandlers[256]; - - Node_format to_bootstrap[MAX_CLOSE_TO_BOOTSTRAP_NODES]; - unsigned int num_to_bootstrap; -} DHT; /*----------------------------------------------------------------------------------*/ /* Shared key generations are costly, it is therefor smart to store commonly used @@ -433,7 +413,7 @@ void cryptopacket_registerhandler(DHT *dht, uint8_t byte, cryptopacket_handler_c uint32_t DHT_size(const DHT *dht); /* Save the DHT in data where data is an array of size DHT_size(). */ -void DHT_save(DHT *dht, uint8_t *data); +void DHT_save(const DHT *dht, uint8_t *data); /* Load the DHT from data of size size. * @@ -447,15 +427,15 @@ DHT *new_DHT(Logger *log, Networking_Core *net, bool holepunching_enabled); void kill_DHT(DHT *dht); -/* return 0 if we are not connected to the DHT. - * return 1 if we are. +/* return false if we are not connected to the DHT. + * return true if we are. */ -int DHT_isconnected(const DHT *dht); +bool DHT_isconnected(const DHT *dht); -/* return 0 if we are not connected or only connected to lan peers with the DHT. - * return 1 if we are. +/* return false if we are not connected or only connected to lan peers with the DHT. + * return true if we are. */ -int DHT_non_lan_connected(const DHT *dht); +bool DHT_non_lan_connected(const DHT *dht); uint32_t addto_lists(DHT *dht, IP_Port ip_port, const uint8_t *public_key); diff --git a/protocols/Tox/libtox/src/toxcore/LAN_discovery.c b/protocols/Tox/libtox/src/toxcore/LAN_discovery.c index b5cf2c525b..70b71fea02 100644 --- a/protocols/Tox/libtox/src/toxcore/LAN_discovery.c +++ b/protocols/Tox/libtox/src/toxcore/LAN_discovery.c @@ -29,12 +29,6 @@ #include "util.h" -/* Used for get_broadcast(). */ -#ifdef __linux -#include <linux/netdevice.h> -#include <sys/ioctl.h> -#endif - #define MAX_INTERFACES 16 @@ -52,7 +46,7 @@ static void fetch_broadcast_info(uint16_t port) IP_ADAPTER_INFO *pAdapterInfo = (IP_ADAPTER_INFO *)malloc(sizeof(IP_ADAPTER_INFO)); unsigned long ulOutBufLen = sizeof(IP_ADAPTER_INFO); - if (pAdapterInfo == NULL) { + if (pAdapterInfo == nullptr) { return; } @@ -60,7 +54,7 @@ static void fetch_broadcast_info(uint16_t port) free(pAdapterInfo); pAdapterInfo = (IP_ADAPTER_INFO *)malloc(ulOutBufLen); - if (pAdapterInfo == NULL) { + if (pAdapterInfo == nullptr) { return; } } @@ -85,9 +79,9 @@ static void fetch_broadcast_info(uint16_t port) if (gateway.family == TOX_AF_INET && subnet_mask.family == TOX_AF_INET) { IP_Port *ip_port = &ip_ports[count]; ip_port->ip.family = TOX_AF_INET; - uint32_t gateway_ip = net_ntohl(gateway.ip4.uint32), subnet_ip = net_ntohl(subnet_mask.ip4.uint32); + uint32_t gateway_ip = net_ntohl(gateway.ip.v4.uint32), subnet_ip = net_ntohl(subnet_mask.ip.v4.uint32); uint32_t broadcast_ip = gateway_ip + ~subnet_ip - 1; - ip_port->ip.ip4.uint32 = net_htonl(broadcast_ip); + ip_port->ip.ip.v4.uint32 = net_htonl(broadcast_ip); ip_port->port = port; count++; @@ -112,7 +106,17 @@ static void fetch_broadcast_info(uint16_t port) } } -#elif defined(__linux__) +#elif defined(__linux__) || defined(__FreeBSD__) + +#ifdef __linux__ +#include <linux/netdevice.h> +#endif + +#ifdef __FreeBSD__ +#include <net/if.h> +#endif + +#include <sys/ioctl.h> static void fetch_broadcast_info(uint16_t port) { @@ -121,9 +125,9 @@ static void fetch_broadcast_info(uint16_t port) * Definitely won't work like this on Windows... */ broadcast_count = 0; - Socket sock = 0; + const Socket sock = net_socket(TOX_AF_INET, TOX_SOCK_STREAM, 0); - if ((sock = net_socket(TOX_AF_INET, TOX_SOCK_STREAM, 0)) < 0) { + if (sock < 0) { return; } @@ -152,9 +156,9 @@ static void fetch_broadcast_info(uint16_t port) * a larger array, not done (640kB and 16 interfaces shall be * enough, for everybody!) */ - int i, n = ifconf.ifc_len / sizeof(struct ifreq); + int n = ifconf.ifc_len / sizeof(struct ifreq); - for (i = 0; i < n; i++) { + for (int i = 0; i < n; i++) { /* there are interfaces with are incapable of broadcast */ if (ioctl(sock, SIOCGIFBRDADDR, &i_faces[i]) < 0) { continue; @@ -173,9 +177,9 @@ static void fetch_broadcast_info(uint16_t port) IP_Port *ip_port = &ip_ports[count]; ip_port->ip.family = TOX_AF_INET; - ip_port->ip.ip4.uint32 = sock4->sin_addr.s_addr; + ip_port->ip.ip.v4.uint32 = sock4->sin_addr.s_addr; - if (ip_port->ip.ip4.uint32 == 0) { + if (ip_port->ip.ip.v4.uint32 == 0) { continue; } @@ -217,9 +221,7 @@ static uint32_t send_broadcasts(Networking_Core *net, uint16_t port, const uint8 return 0; } - int i; - - for (i = 0; i < broadcast_count; i++) { + for (int i = 0; i < broadcast_count; i++) { sendpacket(net, broadcast_ip_ports[i], data, length); } @@ -238,17 +240,17 @@ static IP broadcast_ip(Family family_socket, Family family_broadcast) /* FF02::1 is - according to RFC 4291 - multicast all-nodes link-local */ /* FE80::*: MUST be exact, for that we would need to look over all * interfaces and check in which status they are */ - ip.ip6.uint8[ 0] = 0xFF; - ip.ip6.uint8[ 1] = 0x02; - ip.ip6.uint8[15] = 0x01; + ip.ip.v6.uint8[ 0] = 0xFF; + ip.ip.v6.uint8[ 1] = 0x02; + ip.ip.v6.uint8[15] = 0x01; } else if (family_broadcast == TOX_AF_INET) { ip.family = TOX_AF_INET6; - ip.ip6 = IP6_BROADCAST; + ip.ip.v6 = IP6_BROADCAST; } } else if (family_socket == TOX_AF_INET) { if (family_broadcast == TOX_AF_INET) { ip.family = TOX_AF_INET; - ip.ip4 = IP4_BROADCAST; + ip.ip.v4 = IP4_BROADCAST; } } @@ -259,7 +261,7 @@ static IP broadcast_ip(Family family_socket, Family family_broadcast) bool ip_is_local(IP ip) { if (ip.family == TOX_AF_INET) { - IP4 ip4 = ip.ip4; + IP4 ip4 = ip.ip.v4; /* Loopback. */ if (ip4.uint8[0] == 127) { @@ -267,15 +269,15 @@ bool ip_is_local(IP ip) } } else { /* embedded IPv4-in-IPv6 */ - if (IPV6_IPV4_IN_V6(ip.ip6)) { + if (IPV6_IPV4_IN_V6(ip.ip.v6)) { IP ip4; ip4.family = TOX_AF_INET; - ip4.ip4.uint32 = ip.ip6.uint32[3]; + ip4.ip.v4.uint32 = ip.ip.v6.uint32[3]; return ip_is_local(ip4); } /* localhost in IPv6 (::1) */ - if (ip.ip6.uint64[0] == 0 && ip.ip6.uint32[2] == 0 && ip.ip6.uint32[3] == net_htonl(1)) { + if (ip.ip.v6.uint64[0] == 0 && ip.ip.v6.uint32[2] == 0 && ip.ip.v6.uint32[3] == net_htonl(1)) { return 1; } } @@ -293,7 +295,7 @@ int ip_is_lan(IP ip) } if (ip.family == TOX_AF_INET) { - IP4 ip4 = ip.ip4; + IP4 ip4 = ip.ip.v4; /* 10.0.0.0 to 10.255.255.255 range. */ if (ip4.uint8[0] == 10) { @@ -325,16 +327,16 @@ int ip_is_lan(IP ip) /* autogenerated for each interface: FE80::* (up to FEBF::*) FF02::1 is - according to RFC 4291 - multicast all-nodes link-local */ - if (((ip.ip6.uint8[0] == 0xFF) && (ip.ip6.uint8[1] < 3) && (ip.ip6.uint8[15] == 1)) || - ((ip.ip6.uint8[0] == 0xFE) && ((ip.ip6.uint8[1] & 0xC0) == 0x80))) { + if (((ip.ip.v6.uint8[0] == 0xFF) && (ip.ip.v6.uint8[1] < 3) && (ip.ip.v6.uint8[15] == 1)) || + ((ip.ip.v6.uint8[0] == 0xFE) && ((ip.ip.v6.uint8[1] & 0xC0) == 0x80))) { return 0; } /* embedded IPv4-in-IPv6 */ - if (IPV6_IPV4_IN_V6(ip.ip6)) { + if (IPV6_IPV4_IN_V6(ip.ip.v6)) { IP ip4; ip4.family = TOX_AF_INET; - ip4.ip4.uint32 = ip.ip6.uint32[3]; + ip4.ip.v4.uint32 = ip.ip.v6.uint32[3]; return ip_is_lan(ip4); } } @@ -346,6 +348,9 @@ static int handle_LANdiscovery(void *object, IP_Port source, const uint8_t *pack { DHT *dht = (DHT *)object; + char ip_str[IP_NTOA_LEN] = { 0 }; + ip_ntoa(&source.ip, ip_str, sizeof(ip_str)); + if (ip_is_lan(source.ip) == -1) { return 1; } @@ -354,10 +359,6 @@ static int handle_LANdiscovery(void *object, IP_Port source, const uint8_t *pack return 1; } - char ip_str[IP_NTOA_LEN] = { 0 }; - ip_ntoa(&source.ip, ip_str, sizeof(ip_str)); - LOGGER_DEBUG(dht->log, "Found node in LAN: %s", ip_str); - DHT_bootstrap(dht, source, packet + 1); return 0; } @@ -367,30 +368,30 @@ int lan_discovery_send(uint16_t port, DHT *dht) { uint8_t data[CRYPTO_PUBLIC_KEY_SIZE + 1]; data[0] = NET_PACKET_LAN_DISCOVERY; - id_copy(data + 1, dht->self_public_key); + id_copy(data + 1, dht_get_self_public_key(dht)); - send_broadcasts(dht->net, port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE); + send_broadcasts(dht_get_net(dht), port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE); int res = -1; IP_Port ip_port; ip_port.port = port; /* IPv6 multicast */ - if (net_family(dht->net) == TOX_AF_INET6) { + if (net_family(dht_get_net(dht)) == TOX_AF_INET6) { ip_port.ip = broadcast_ip(TOX_AF_INET6, TOX_AF_INET6); if (ip_isset(&ip_port.ip)) { - if (sendpacket(dht->net, ip_port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE) > 0) { + if (sendpacket(dht_get_net(dht), ip_port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE) > 0) { res = 1; } } } /* IPv4 broadcast (has to be IPv4-in-IPv6 mapping if socket is TOX_AF_INET6 */ - ip_port.ip = broadcast_ip(net_family(dht->net), TOX_AF_INET); + ip_port.ip = broadcast_ip(net_family(dht_get_net(dht)), TOX_AF_INET); if (ip_isset(&ip_port.ip)) { - if (sendpacket(dht->net, ip_port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE)) { + if (sendpacket(dht_get_net(dht), ip_port, data, 1 + CRYPTO_PUBLIC_KEY_SIZE)) { res = 1; } } @@ -401,10 +402,10 @@ int lan_discovery_send(uint16_t port, DHT *dht) void lan_discovery_init(DHT *dht) { - networking_registerhandler(dht->net, NET_PACKET_LAN_DISCOVERY, &handle_LANdiscovery, dht); + networking_registerhandler(dht_get_net(dht), NET_PACKET_LAN_DISCOVERY, &handle_LANdiscovery, dht); } void lan_discovery_kill(DHT *dht) { - networking_registerhandler(dht->net, NET_PACKET_LAN_DISCOVERY, NULL, NULL); + networking_registerhandler(dht_get_net(dht), NET_PACKET_LAN_DISCOVERY, nullptr, nullptr); } diff --git a/protocols/Tox/libtox/src/toxcore/Messenger.c b/protocols/Tox/libtox/src/toxcore/Messenger.c index fcee455ccc..6e209f4db3 100644 --- a/protocols/Tox/libtox/src/toxcore/Messenger.c +++ b/protocols/Tox/libtox/src/toxcore/Messenger.c @@ -33,7 +33,6 @@ #include <assert.h> -static void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status, void *userdata); 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); @@ -57,13 +56,13 @@ static int realloc_friendlist(Messenger *m, uint32_t num) { if (num == 0) { free(m->friendlist); - m->friendlist = NULL; + m->friendlist = nullptr; return 0; } Friend *newfriendlist = (Friend *)realloc(m->friendlist, num * sizeof(Friend)); - if (newfriendlist == NULL) { + if (newfriendlist == nullptr) { return -1; } @@ -322,8 +321,8 @@ static int clear_receipts(Messenger *m, int32_t friendnumber) receipts = temp_r; } - m->friendlist[friendnumber].receipts_start = NULL; - m->friendlist[friendnumber].receipts_end = NULL; + m->friendlist[friendnumber].receipts_start = nullptr; + m->friendlist[friendnumber].receipts_end = nullptr; return 0; } @@ -349,7 +348,7 @@ static int add_receipt(Messenger *m, int32_t friendnumber, uint32_t packet_num, } m->friendlist[friendnumber].receipts_end = new_receipts; - new_receipts->next = NULL; + new_receipts->next = nullptr; return 0; } /* @@ -393,7 +392,7 @@ static int do_receipts(Messenger *m, int32_t friendnumber, void *userdata) } if (!m->friendlist[friendnumber].receipts_start) { - m->friendlist[friendnumber].receipts_end = NULL; + m->friendlist[friendnumber].receipts_end = nullptr; } return 0; @@ -416,7 +415,8 @@ int m_delfriend(Messenger *m, int32_t friendnumber) clear_receipts(m, friendnumber); remove_request_received(m->fr, m->friendlist[friendnumber].real_pk); - friend_connection_callbacks(m->fr_c, m->friendlist[friendnumber].friendcon_id, MESSENGER_CALLBACK_INDEX, 0, 0, 0, 0, 0); + friend_connection_callbacks(m->fr_c, m->friendlist[friendnumber].friendcon_id, MESSENGER_CALLBACK_INDEX, nullptr, + nullptr, nullptr, nullptr, 0); if (friend_con_connected(m->fr_c, m->friendlist[friendnumber].friendcon_id) == FRIENDCONN_STATUS_CONNECTED) { send_offline_packet(m, m->friendlist[friendnumber].friendcon_id); @@ -488,8 +488,7 @@ int m_friend_exists(const Messenger *m, int32_t friendnumber) int m_send_message_generic(Messenger *m, int32_t friendnumber, uint8_t type, const uint8_t *message, uint32_t length, uint32_t *message_id) { - /* MESSAGE_LAST itself is incorrect value */ - if (type >= MESSAGE_LAST) { + if (type > MESSAGE_ACTION) { return -5; } @@ -601,7 +600,7 @@ int setname(Messenger *m, const uint8_t *name, uint16_t length) */ uint16_t getself_name(const Messenger *m, uint8_t *name) { - if (name == NULL) { + if (name == nullptr) { return 0; } @@ -949,7 +948,7 @@ static void check_friend_connectionstatus(Messenger *m, int32_t friendnumber, ui } } -void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status, void *userdata) +static void set_friend_status(Messenger *m, int32_t friendnumber, uint8_t status, void *userdata) { check_friend_connectionstatus(m, friendnumber, status, userdata); m->friendlist[friendnumber].status = status; @@ -1283,7 +1282,7 @@ int file_control(const Messenger *m, int32_t friendnumber, uint32_t filenumber, } } - if (send_file_control_packet(m, friendnumber, send_receive, file_number, control, 0, 0)) { + if (send_file_control_packet(m, friendnumber, send_receive, file_number, control, nullptr, 0)) { if (control == FILECONTROL_KILL) { ft->status = FILESTATUS_NONE; @@ -1482,119 +1481,159 @@ uint64_t file_dataremaining(const Messenger *m, int32_t friendnumber, uint8_t fi return 0; } + const struct File_Transfers *const sending = &m->friendlist[friendnumber].file_sending[filenumber]; + if (send_receive == 0) { - if (m->friendlist[friendnumber].file_sending[filenumber].status == FILESTATUS_NONE) { + if (sending->status == FILESTATUS_NONE) { return 0; } - return m->friendlist[friendnumber].file_sending[filenumber].size - - m->friendlist[friendnumber].file_sending[filenumber].transferred; + return sending->size - sending->transferred; } - if (m->friendlist[friendnumber].file_receiving[filenumber].status == FILESTATUS_NONE) { + const struct File_Transfers *const receiving = &m->friendlist[friendnumber].file_receiving[filenumber]; + + if (receiving->status == FILESTATUS_NONE) { return 0; } - return m->friendlist[friendnumber].file_receiving[filenumber].size - - m->friendlist[friendnumber].file_receiving[filenumber].transferred; + return receiving->size - receiving->transferred; } -static void do_reqchunk_filecb(Messenger *m, int32_t friendnumber, void *userdata) +/** + * Iterate over all file transfers and request chunks (from the client) for each + * of them. + * + * The free_slots parameter is updated by this function. + * + * @param m Our messenger object. + * @param friendnumber The friend we're sending files to. + * @param userdata The client userdata to pass along to chunk request callbacks. + * @param free_slots A pointer to the number of free send queue slots in the + * crypto connection. + * + * @return true if there are still file transfers ongoing, false if all file + * transfers are complete. + */ +static bool do_all_filetransfers(Messenger *m, int32_t friendnumber, void *userdata, uint32_t *free_slots) { - if (!m->friendlist[friendnumber].num_sending_files) { - return; - } + Friend *const friendcon = &m->friendlist[friendnumber]; + uint32_t num = friendcon->num_sending_files; - int free_slots = crypto_num_free_sendqueue_slots(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c, - m->friendlist[friendnumber].friendcon_id)); + bool any_active_fts = false; - if (free_slots < MIN_SLOTS_FREE) { - free_slots = 0; - } else { - free_slots -= MIN_SLOTS_FREE; - } - - unsigned int i, num = m->friendlist[friendnumber].num_sending_files; - - for (i = 0; i < MAX_CONCURRENT_FILE_PIPES; ++i) { - struct File_Transfers *ft = &m->friendlist[friendnumber].file_sending[i]; + // Iterate over all file transfers, including inactive ones. I.e. we always + // iterate exactly MAX_CONCURRENT_FILE_PIPES times. + for (uint32_t i = 0; i < MAX_CONCURRENT_FILE_PIPES; ++i) { + struct File_Transfers *const ft = &friendcon->file_sending[i]; + // Any status other than NONE means the file transfer is active. if (ft->status != FILESTATUS_NONE) { + any_active_fts = true; --num; - if (ft->status == FILESTATUS_FINISHED) { - /* Check if file was entirely sent. */ - if (friend_received_packet(m, friendnumber, ft->last_packet_number) == 0) { - if (m->file_reqchunk) { - (*m->file_reqchunk)(m, friendnumber, i, ft->transferred, 0, userdata); - } - - ft->status = FILESTATUS_NONE; - --m->friendlist[friendnumber].num_sending_files; + // If the file transfer is complete, we request a chunk of size 0. + if (ft->status == FILESTATUS_FINISHED && friend_received_packet(m, friendnumber, ft->last_packet_number) == 0) { + if (m->file_reqchunk) { + m->file_reqchunk(m, friendnumber, i, ft->transferred, 0, userdata); } - } - /* TODO(irungentoo): if file is too slow, switch to the next. */ - if (ft->slots_allocated > (unsigned int)free_slots) { - free_slots = 0; - } else { - free_slots -= ft->slots_allocated; + // Now it's inactive, we're no longer sending this. + ft->status = FILESTATUS_NONE; + --friendcon->num_sending_files; } + + // Decrease free slots by the number of slots this FT uses. + *free_slots = max_s32(0, (int32_t) * free_slots - ft->slots_allocated); } - while (ft->status == FILESTATUS_TRANSFERRING && (ft->paused == FILE_PAUSE_NOT)) { - if (max_speed_reached(m->net_crypto, friend_connection_crypt_connection_id(m->fr_c, - m->friendlist[friendnumber].friendcon_id))) { - free_slots = 0; + if (ft->status == FILESTATUS_TRANSFERRING && ft->paused == FILE_PAUSE_NOT) { + if (max_speed_reached(m->net_crypto, friend_connection_crypt_connection_id( + m->fr_c, friendcon->friendcon_id))) { + *free_slots = 0; } - if (free_slots == 0) { - break; + if (*free_slots == 0) { + continue; } - uint16_t length = MAX_FILE_DATA_SIZE; - if (ft->size == 0) { /* Send 0 data to friend if file is 0 length. */ - file_data(m, friendnumber, i, 0, 0, 0); - break; + file_data(m, friendnumber, i, 0, nullptr, 0); + continue; } if (ft->size == ft->requested) { - break; - } - - if (ft->size - ft->requested < length) { - length = ft->size - ft->requested; + // This file transfer is done. + continue; } - ++ft->slots_allocated; + // Allocate 1 slot to this file transfer. + ft->slots_allocated++; - uint64_t position = ft->requested; + const uint16_t length = min_u64(ft->size - ft->requested, MAX_FILE_DATA_SIZE); + const uint64_t position = ft->requested; ft->requested += length; if (m->file_reqchunk) { - (*m->file_reqchunk)(m, friendnumber, i, position, length, userdata); + m->file_reqchunk(m, friendnumber, i, position, length, userdata); } - --free_slots; + // The allocated slot is no longer free. + --*free_slots; } if (num == 0) { - break; + continue; } } + + return any_active_fts; +} + +static void do_reqchunk_filecb(Messenger *m, int32_t friendnumber, void *userdata) +{ + // We're not currently doing any file transfers. + if (m->friendlist[friendnumber].num_sending_files == 0) { + return; + } + + // The number of packet slots left in the sendbuffer. + // This is a per friend count (CRYPTO_PACKET_BUFFER_SIZE). + uint32_t free_slots = crypto_num_free_sendqueue_slots( + m->net_crypto, + friend_connection_crypt_connection_id( + m->fr_c, + m->friendlist[friendnumber].friendcon_id)); + + // We keep MIN_SLOTS_FREE slots free for other packets, otherwise file + // transfers might block other traffic for a long time. + free_slots = max_s32(0, (int32_t)free_slots - MIN_SLOTS_FREE); + + bool any_active_fts = true; + uint32_t loop_counter = 0; + // Maximum number of outer loops below. If the client doesn't send file + // chunks from within the chunk request callback handler, we never realise + // that the file transfer has finished and may end up in an infinite loop. + // + // TODO(zoff99): Fix this to exit the loop properly when we're done + // requesting all chunks for all file transfers. + const uint32_t MAX_FT_LOOPS = 16; + + while (((free_slots > 0) || loop_counter == 0) && any_active_fts && (loop_counter < MAX_FT_LOOPS)) { + any_active_fts = do_all_filetransfers(m, friendnumber, userdata, &free_slots); + loop_counter++; + } } + /* Run this when the friend disconnects. * Kill all current file transfers. */ static void break_files(const Messenger *m, int32_t friendnumber) { - uint32_t i; - // TODO(irungentoo): Inform the client which file transfers get killed with a callback? - for (i = 0; i < MAX_CONCURRENT_FILE_PIPES; ++i) { + for (uint32_t i = 0; i < MAX_CONCURRENT_FILE_PIPES; ++i) { if (m->friendlist[friendnumber].file_sending[i].status != FILESTATUS_NONE) { m->friendlist[friendnumber].file_sending[i].status = FILESTATUS_NONE; } @@ -1619,7 +1658,7 @@ static struct File_Transfers *get_file_transfer(uint8_t receive_send, uint8_t fi } if (ft->status == FILESTATUS_NONE) { - return NULL; + return nullptr; } return ft; @@ -1639,10 +1678,10 @@ static int handle_filecontrol(Messenger *m, int32_t friendnumber, uint8_t receiv uint32_t real_filenumber; struct File_Transfers *ft = get_file_transfer(receive_send, filenumber, &real_filenumber, &m->friendlist[friendnumber]); - if (ft == NULL) { + if (ft == nullptr) { LOGGER_DEBUG(m->log, "file control (friend %d, file %d): file transfer does not exist; telling the other to kill it", friendnumber, filenumber); - send_file_control_packet(m, friendnumber, !receive_send, filenumber, FILECONTROL_KILL, 0, 0); + send_file_control_packet(m, friendnumber, !receive_send, filenumber, FILECONTROL_KILL, nullptr, 0); return -1; } @@ -1785,13 +1824,13 @@ static int m_handle_custom_lossy_packet(void *object, int friend_num, const uint return 1; } -void custom_lossy_packet_registerhandler(Messenger *m, void (*packet_handler_callback)(Messenger *m, +void custom_lossy_packet_registerhandler(Messenger *m, void (*lossy_packethandler)(Messenger *m, uint32_t friendnumber, const uint8_t *data, size_t len, void *object)) { - m->lossy_packethandler = packet_handler_callback; + m->lossy_packethandler = lossy_packethandler; } -int m_callback_rtp_packet(Messenger *m, int32_t friendnumber, uint8_t byte, int (*packet_handler_callback)(Messenger *m, +int m_callback_rtp_packet(Messenger *m, int32_t friendnumber, uint8_t byte, int (*function)(Messenger *m, uint32_t friendnumber, const uint8_t *data, uint16_t len, void *object), void *object) { if (friend_not_valid(m, friendnumber)) { @@ -1806,8 +1845,7 @@ int m_callback_rtp_packet(Messenger *m, int32_t friendnumber, uint8_t byte, int return -1; } - m->friendlist[friendnumber].lossy_rtp_packethandlers[byte % PACKET_LOSSY_AV_RESERVED].function = - packet_handler_callback; + m->friendlist[friendnumber].lossy_rtp_packethandlers[byte % PACKET_LOSSY_AV_RESERVED].function = function; m->friendlist[friendnumber].lossy_rtp_packethandlers[byte % PACKET_LOSSY_AV_RESERVED].object = object; return 0; } @@ -1867,10 +1905,10 @@ static int handle_custom_lossless_packet(void *object, int friend_num, const uin return 1; } -void custom_lossless_packet_registerhandler(Messenger *m, void (*packet_handler_callback)(Messenger *m, +void custom_lossless_packet_registerhandler(Messenger *m, void (*lossless_packethandler)(Messenger *m, uint32_t friendnumber, const uint8_t *data, size_t len, void *object)) { - m->lossless_packethandler = packet_handler_callback; + m->lossless_packethandler = lossless_packethandler; } int send_custom_lossless_packet(const Messenger *m, int32_t friendnumber, const uint8_t *data, uint32_t length) @@ -1919,7 +1957,7 @@ static int friend_already_added(const uint8_t *real_pk, void *data) Messenger *new_messenger(Messenger_Options *options, unsigned int *error) { if (!options) { - return NULL; + return nullptr; } if (error) { @@ -1929,22 +1967,22 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error) Messenger *m = (Messenger *)calloc(1, sizeof(Messenger)); if (!m) { - return NULL; + return nullptr; } m->fr = friendreq_new(); if (!m->fr) { free(m); - return NULL; + return nullptr; } - Logger *log = NULL; + Logger *log = nullptr; if (options->log_callback) { log = logger_new(); - if (log != NULL) { + if (log != nullptr) { logger_callback_log(log, options->log_callback, m, options->log_user_data); } } @@ -1961,34 +1999,37 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error) m->net = new_networking_ex(log, ip, options->port_range[0], options->port_range[1], &net_err); } - if (m->net == NULL) { + if (m->net == nullptr) { friendreq_kill(m->fr); + logger_kill(m->log); free(m); if (error && net_err == 1) { *error = MESSENGER_ERROR_PORT; } - return NULL; + return nullptr; } m->dht = new_DHT(m->log, m->net, options->hole_punching_enabled); - if (m->dht == NULL) { + if (m->dht == nullptr) { kill_networking(m->net); friendreq_kill(m->fr); + logger_kill(m->log); free(m); - return NULL; + return nullptr; } m->net_crypto = new_net_crypto(m->log, m->dht, &options->proxy_info); - if (m->net_crypto == NULL) { + if (m->net_crypto == nullptr) { kill_networking(m->net); kill_DHT(m->dht); friendreq_kill(m->fr); + logger_kill(m->log); free(m); - return NULL; + return nullptr; } m->onion = new_onion(m->dht); @@ -2005,14 +2046,16 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error) kill_DHT(m->dht); kill_networking(m->net); friendreq_kill(m->fr); + logger_kill(m->log); free(m); - return NULL; + return nullptr; } if (options->tcp_server_port) { - m->tcp_server = new_TCP_server(options->ipv6enabled, 1, &options->tcp_server_port, m->dht->self_secret_key, m->onion); + m->tcp_server = new_TCP_server(options->ipv6enabled, 1, &options->tcp_server_port, dht_get_self_secret_key(m->dht), + m->onion); - if (m->tcp_server == NULL) { + if (m->tcp_server == nullptr) { kill_friend_connections(m->fr_c); kill_onion(m->onion); kill_onion_announce(m->onion_a); @@ -2021,13 +2064,14 @@ Messenger *new_messenger(Messenger_Options *options, unsigned int *error) kill_DHT(m->dht); kill_networking(m->net); friendreq_kill(m->fr); + logger_kill(m->log); free(m); if (error) { *error = MESSENGER_ERROR_TCP_SERVER; } - return NULL; + return nullptr; } } @@ -2214,8 +2258,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le } case PACKET_ID_MESSAGE: // fall-through - case PACKET_ID_ACTION: - case PACKET_ID_CORRECTION: { + case PACKET_ID_ACTION: { if (data_length == 0) { break; } @@ -2257,10 +2300,14 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le uint8_t filenumber = data[0]; +#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES + if (filenumber >= MAX_CONCURRENT_FILE_PIPES) { break; } +#endif + uint64_t filesize; uint32_t file_type; uint16_t filename_length = data_length - head_length; @@ -2287,7 +2334,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le memcpy(ft->id, data + 1 + sizeof(uint32_t) + sizeof(uint64_t), FILE_ID_LENGTH); VLA(uint8_t, filename_terminated, filename_length + 1); - uint8_t *filename = NULL; + uint8_t *filename = nullptr; if (filename_length) { /* Force NULL terminate file name. */ @@ -2317,10 +2364,14 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le uint8_t filenumber = data[1]; uint8_t control_type = data[2]; +#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES + if (filenumber >= MAX_CONCURRENT_FILE_PIPES) { break; } +#endif + if (handle_filecontrol(m, i, send_receive, filenumber, control_type, data + 3, data_length - 3, userdata) == -1) { // TODO(iphydf): Do something different here? Right now, this // check is pointless. @@ -2337,10 +2388,14 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le uint8_t filenumber = data[0]; +#if UINT8_MAX >= MAX_CONCURRENT_FILE_PIPES + if (filenumber >= MAX_CONCURRENT_FILE_PIPES) { break; } +#endif + struct File_Transfers *ft = &m->friendlist[i].file_receiving[filenumber]; if (ft->status != FILESTATUS_TRANSFERRING) { @@ -2355,7 +2410,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le const uint8_t *file_data; if (file_data_length == 0) { - file_data = NULL; + file_data = nullptr; } else { file_data = data + 1; } @@ -2373,7 +2428,7 @@ static int m_handle_packet(void *object, int i, const uint8_t *temp, uint16_t le if (file_data_length && (ft->transferred >= ft->size || file_data_length != MAX_FILE_DATA_SIZE)) { file_data_length = 0; - file_data = NULL; + file_data = nullptr; position = ft->transferred; /* Full file received. */ @@ -2467,7 +2522,7 @@ static void do_friends(Messenger *m, void *userdata) do_receipts(m, i, userdata); do_reqchunk_filecb(m, i, userdata); - m->friendlist[i].last_seen_time = (uint64_t) time(NULL); + m->friendlist[i].last_seen_time = (uint64_t) time(nullptr); } } } @@ -2543,7 +2598,7 @@ void do_messenger(Messenger *m, void *userdata) IP_Port local_ip_port; local_ip_port.port = m->options.tcp_server_port; local_ip_port.ip.family = TOX_AF_INET; - local_ip_port.ip.ip4 = get_ip4_loopback(); + local_ip_port.ip.ip.v4 = get_ip4_loopback(); add_tcp_relay(m->net_crypto, local_ip_port, tcp_server_public_key(m->tcp_server)); } @@ -2571,8 +2626,8 @@ void do_messenger(Messenger *m, void *userdata) uint32_t client, last_pinged; for (client = 0; client < LCLIENT_LIST; client++) { - Client_data *cptr = &m->dht->close_clientlist[client]; - IPPTsPng *assoc = NULL; + const Client_data *cptr = dht_get_close_client(m->dht, client); + const IPPTsPng *assoc = nullptr; uint32_t a; for (a = 0, assoc = &cptr->assoc4; a < 2; a++, assoc = &cptr->assoc6) { @@ -2597,7 +2652,7 @@ void do_messenger(Messenger *m, void *userdata) uint32_t friend_idx, dhtfriend; /* dht contains additional "friends" (requests) */ - uint32_t num_dhtfriends = m->dht->num_friends; + uint32_t num_dhtfriends = dht_get_num_friends(m->dht); VLA(int32_t, m2dht, num_dhtfriends); VLA(int32_t, dht2m, num_dhtfriends); @@ -2609,8 +2664,8 @@ void do_messenger(Messenger *m, void *userdata) continue; } - for (dhtfriend = 0; dhtfriend < m->dht->num_friends; dhtfriend++) { - if (id_equal(m->friendlist[friend_idx].real_pk, m->dht->friends_list[dhtfriend].public_key)) { + for (dhtfriend = 0; dhtfriend < dht_get_num_friends(m->dht); dhtfriend++) { + if (id_equal(m->friendlist[friend_idx].real_pk, dht_get_friend_public_key(m->dht, dhtfriend))) { m2dht[friend_idx] = dhtfriend; break; } @@ -2623,8 +2678,8 @@ void do_messenger(Messenger *m, void *userdata) } } - if (m->numfriends != m->dht->num_friends) { - LOGGER_TRACE(m->log, "Friend num in DHT %u != friend num in msger %u\n", m->dht->num_friends, m->numfriends); + 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); } Friend *msgfptr; @@ -2634,10 +2689,10 @@ void do_messenger(Messenger *m, void *userdata) if (dht2m[friend_idx] >= 0) { msgfptr = &m->friendlist[dht2m[friend_idx]]; } else { - msgfptr = NULL; + msgfptr = nullptr; } - dhtfptr = &m->dht->friends_list[friend_idx]; + dhtfptr = dht_get_friend(m->dht, friend_idx); if (msgfptr) { char id_str[IDSTRING_LEN]; @@ -2652,7 +2707,7 @@ void do_messenger(Messenger *m, void *userdata) for (client = 0; client < MAX_FRIEND_CLIENTS; client++) { Client_data *cptr = &dhtfptr->client_list[client]; - IPPTsPng *assoc = NULL; + IPPTsPng *assoc = nullptr; uint32_t a; for (a = 0, assoc = &cptr->assoc4; a < 2; a++, assoc = &cptr->assoc6) { @@ -2708,13 +2763,13 @@ struct SAVED_FRIEND { uint64_t last_seen_time; }; -static uint32_t friend_size() +static uint32_t friend_size(void) { uint32_t data = 0; - const struct SAVED_FRIEND temp = { 0 }; + const struct SAVED_FRIEND *const temp = nullptr; -#define VALUE_MEMBER(NAME) data += sizeof(temp.NAME) -#define ARRAY_MEMBER(NAME) data += sizeof(temp.NAME) +#define VALUE_MEMBER(NAME) data += sizeof(temp->NAME) +#define ARRAY_MEMBER(NAME) data += sizeof(temp->NAME) // Exactly the same in friend_load, friend_save, and friend_size VALUE_MEMBER(status); @@ -3061,7 +3116,7 @@ static int messenger_load_state_callback(void *outer, const uint8_t *data, uint3 break; } - unpack_nodes(m->loaded_relays, NUM_SAVED_TCP_RELAYS, 0, data, length, 1); + unpack_nodes(m->loaded_relays, NUM_SAVED_TCP_RELAYS, nullptr, data, length, 1); m->has_added_relays = 0; break; @@ -3074,7 +3129,7 @@ static int messenger_load_state_callback(void *outer, const uint8_t *data, uint3 break; } - int i, num = unpack_nodes(nodes, NUM_SAVED_PATH_NODES, 0, data, length, 0); + int i, num = unpack_nodes(nodes, NUM_SAVED_PATH_NODES, nullptr, data, length, 0); for (i = 0; i < num; ++i) { onion_add_bs_path_node(m->onion_c, nodes[i].ip_port, nodes[i].public_key); diff --git a/protocols/Tox/libtox/src/toxcore/Messenger.h b/protocols/Tox/libtox/src/toxcore/Messenger.h index a261a507db..402eb91650 100644 --- a/protocols/Tox/libtox/src/toxcore/Messenger.h +++ b/protocols/Tox/libtox/src/toxcore/Messenger.h @@ -37,14 +37,16 @@ /* This cannot be bigger than 256 */ #define MAX_CONCURRENT_FILE_PIPES 256 +#if !defined(__SPLINT__) && MAX_CONCURRENT_FILE_PIPES > UINT8_MAX + 1 +#error "uint8_t cannot represent all file transfer numbers" +#endif + #define FRIEND_ADDRESS_SIZE (CRYPTO_PUBLIC_KEY_SIZE + sizeof(uint32_t) + sizeof(uint16_t)) enum { MESSAGE_NORMAL, - MESSAGE_ACTION, - MESSAGE_CORRECTION, - MESSAGE_LAST + MESSAGE_ACTION }; /* NOTE: Packet ids below 24 must never be used. */ @@ -56,7 +58,6 @@ enum { #define PACKET_ID_TYPING 51 #define PACKET_ID_MESSAGE 64 #define PACKET_ID_ACTION (PACKET_ID_MESSAGE + MESSAGE_ACTION) /* 65 */ -#define PACKET_ID_CORRECTION (PACKET_ID_MESSAGE + MESSAGE_CORRECTION) /* 66 */ #define PACKET_ID_MSI 69 #define PACKET_ID_FILE_SENDREQUEST 80 #define PACKET_ID_FILE_CONTROL 81 @@ -73,13 +74,13 @@ enum { #define PACKET_LOSSY_AV_RESERVED 8 /* Number of lossy packet types at start of range reserved for A/V. */ typedef struct { - uint8_t ipv6enabled; - uint8_t udp_disabled; + bool ipv6enabled; + bool udp_disabled; TCP_Proxy_Info proxy_info; uint16_t port_range[2]; uint16_t tcp_server_port; - uint8_t hole_punching_enabled; + bool hole_punching_enabled; bool local_discovery_enabled; logger_cb *log_callback; @@ -205,7 +206,7 @@ typedef struct { uint64_t last_seen_time; uint8_t last_connection_udp_tcp; struct File_Transfers file_sending[MAX_CONCURRENT_FILE_PIPES]; - unsigned int num_sending_files; + uint32_t num_sending_files; struct File_Transfers file_receiving[MAX_CONCURRENT_FILE_PIPES]; struct { diff --git a/protocols/Tox/libtox/src/toxcore/TCP_client.c b/protocols/Tox/libtox/src/toxcore/TCP_client.c index b4092f803d..a6c32f9c64 100644 --- a/protocols/Tox/libtox/src/toxcore/TCP_client.c +++ b/protocols/Tox/libtox/src/toxcore/TCP_client.c @@ -110,9 +110,9 @@ void tcp_con_set_custom_object(TCP_Client_Connection *con, void *object) { con->custom_object = object; } -void tcp_con_set_custom_uint(TCP_Client_Connection *con, uint32_t uint) +void tcp_con_set_custom_uint(TCP_Client_Connection *con, uint32_t value) { - con->custom_uint = uint; + con->custom_uint = value; } /* return 1 on success @@ -230,12 +230,12 @@ static void proxy_socks5_generate_connection_request(TCP_Client_Connection *TCP_ if (TCP_conn->ip_port.ip.family == TOX_AF_INET) { TCP_conn->last_packet[3] = 1; /* IPv4 address */ ++length; - memcpy(TCP_conn->last_packet + length, TCP_conn->ip_port.ip.ip4.uint8, sizeof(IP4)); + memcpy(TCP_conn->last_packet + length, TCP_conn->ip_port.ip.ip.v4.uint8, sizeof(IP4)); length += sizeof(IP4); } else { TCP_conn->last_packet[3] = 4; /* IPv6 address */ ++length; - memcpy(TCP_conn->last_packet + length, TCP_conn->ip_port.ip.ip6.uint8, sizeof(IP6)); + memcpy(TCP_conn->last_packet + length, TCP_conn->ip_port.ip.ip.v6.uint8, sizeof(IP6)); length += sizeof(IP6); } @@ -382,7 +382,7 @@ static int client_send_pending_data(TCP_Client_Connection *con) con->priority_queue_start = p; if (!p) { - con->priority_queue_end = NULL; + con->priority_queue_end = nullptr; return 0; } @@ -401,7 +401,7 @@ static bool client_add_priority(TCP_Client_Connection *con, const uint8_t *packe return 0; } - new_list->next = NULL; + new_list->next = nullptr; new_list->size = size; new_list->sent = sent; memcpy(new_list->data, packet, size); @@ -694,16 +694,16 @@ TCP_Client_Connection *new_TCP_connection(IP_Port ip_port, const uint8_t *public const uint8_t *self_secret_key, TCP_Proxy_Info *proxy_info) { if (networking_at_startup() != 0) { - return NULL; + return nullptr; } if (ip_port.ip.family != TOX_AF_INET && ip_port.ip.family != TOX_AF_INET6) { - return NULL; + return nullptr; } TCP_Proxy_Info default_proxyinfo; - if (proxy_info == NULL) { + if (proxy_info == nullptr) { default_proxyinfo.proxy_type = TCP_PROXY_NONE; proxy_info = &default_proxyinfo; } @@ -717,24 +717,24 @@ TCP_Client_Connection *new_TCP_connection(IP_Port ip_port, const uint8_t *public Socket sock = net_socket(family, TOX_SOCK_STREAM, TOX_PROTO_TCP); if (!sock_valid(sock)) { - return NULL; + return nullptr; } if (!set_socket_nosigpipe(sock)) { kill_sock(sock); - return 0; + return nullptr; } if (!(set_socket_nonblock(sock) && connect_sock_to(sock, ip_port, proxy_info))) { kill_sock(sock); - return NULL; + return nullptr; } TCP_Client_Connection *temp = (TCP_Client_Connection *)calloc(sizeof(TCP_Client_Connection), 1); - if (temp == NULL) { + if (temp == nullptr) { kill_sock(sock); - return NULL; + return nullptr; } temp->sock = sock; @@ -761,7 +761,7 @@ TCP_Client_Connection *new_TCP_connection(IP_Port ip_port, const uint8_t *public if (generate_handshake(temp) == -1) { kill_sock(sock); free(temp); - return NULL; + return nullptr; } break; @@ -1062,7 +1062,7 @@ void do_TCP_connection(TCP_Client_Connection *TCP_connection, void *userdata) */ void kill_TCP_connection(TCP_Client_Connection *TCP_connection) { - if (TCP_connection == NULL) { + if (TCP_connection == nullptr) { return; } diff --git a/protocols/Tox/libtox/src/toxcore/TCP_connection.c b/protocols/Tox/libtox/src/toxcore/TCP_connection.c index a43069da68..d10114f625 100644 --- a/protocols/Tox/libtox/src/toxcore/TCP_connection.c +++ b/protocols/Tox/libtox/src/toxcore/TCP_connection.c @@ -72,13 +72,28 @@ const uint8_t *tcp_connections_public_key(const TCP_Connections *tcp_c) * return -1 if realloc fails. * return 0 if it succeeds. */ -#define realloc_tox_array(array, element_type, num, temp_pointer) \ - (num \ - ? (temp_pointer = (element_type *)realloc( \ - array, \ - (num) * sizeof(element_type)), \ - temp_pointer ? (array = temp_pointer, 0) : -1) \ - : (free(array), array = NULL, 0)) +#define MAKE_REALLOC(T) \ +static int realloc_##T(T **array, size_t num) \ +{ \ + if (!num) { \ + free(*array); \ + *array = nullptr; \ + return 0; \ + } \ + \ + T *temp_pointer = (T *)realloc(*array, num * sizeof(T)); \ + \ + if (!temp_pointer) { \ + return -1; \ + } \ + \ + *array = temp_pointer; \ + \ + return 0; \ +} + +MAKE_REALLOC(TCP_Connection_to) +MAKE_REALLOC(TCP_con) /* return 1 if the connections_number is not valid. @@ -90,7 +105,7 @@ static bool connections_number_not_valid(const TCP_Connections *tcp_c, int conne return 1; } - if (tcp_c->connections == NULL) { + if (tcp_c->connections == nullptr) { return 1; } @@ -110,7 +125,7 @@ static bool tcp_connections_number_not_valid(const TCP_Connections *tcp_c, int t return 1; } - if (tcp_c->tcp_connections == NULL) { + if (tcp_c->tcp_connections == nullptr) { return 1; } @@ -138,10 +153,7 @@ static int create_connection(TCP_Connections *tcp_c) int id = -1; - TCP_Connection_to *temp_pointer; - - if (realloc_tox_array(tcp_c->connections, TCP_Connection_to, tcp_c->connections_length + 1, - temp_pointer) == 0) { + if (realloc_TCP_Connection_to(&tcp_c->connections, tcp_c->connections_length + 1) == 0) { id = tcp_c->connections_length; ++tcp_c->connections_length; memset(&tcp_c->connections[id], 0, sizeof(TCP_Connection_to)); @@ -167,9 +179,7 @@ static int create_tcp_connection(TCP_Connections *tcp_c) int id = -1; - TCP_con *temp_pointer; - - if (realloc_tox_array(tcp_c->tcp_connections, TCP_con, tcp_c->tcp_connections_length + 1, temp_pointer) == 0) { + if (realloc_TCP_con(&tcp_c->tcp_connections, tcp_c->tcp_connections_length + 1) == 0) { id = tcp_c->tcp_connections_length; ++tcp_c->tcp_connections_length; memset(&tcp_c->tcp_connections[id], 0, sizeof(TCP_con)); @@ -200,8 +210,7 @@ static int wipe_connection(TCP_Connections *tcp_c, int connections_number) if (tcp_c->connections_length != i) { tcp_c->connections_length = i; - TCP_Connection_to *temp_pointer; - realloc_tox_array(tcp_c->connections, TCP_Connection_to, tcp_c->connections_length, temp_pointer); + realloc_TCP_Connection_to(&tcp_c->connections, tcp_c->connections_length); } return 0; @@ -229,8 +238,7 @@ static int wipe_tcp_connection(TCP_Connections *tcp_c, int tcp_connections_numbe if (tcp_c->tcp_connections_length != i) { tcp_c->tcp_connections_length = i; - TCP_con *temp_pointer; - realloc_tox_array(tcp_c->tcp_connections, TCP_con, tcp_c->tcp_connections_length, temp_pointer); + realloc_TCP_con(&tcp_c->tcp_connections, tcp_c->tcp_connections_length); } return 0; @@ -239,7 +247,7 @@ static int wipe_tcp_connection(TCP_Connections *tcp_c, int tcp_connections_numbe static TCP_Connection_to *get_connection(const TCP_Connections *tcp_c, int connections_number) { if (connections_number_not_valid(tcp_c, connections_number)) { - return 0; + return nullptr; } return &tcp_c->connections[connections_number]; @@ -248,7 +256,7 @@ static TCP_Connection_to *get_connection(const TCP_Connections *tcp_c, int conne static TCP_con *get_tcp_connection(const TCP_Connections *tcp_c, int tcp_connections_number) { if (tcp_connections_number_not_valid(tcp_c, tcp_connections_number)) { - return 0; + return nullptr; } return &tcp_c->tcp_connections[tcp_connections_number]; @@ -824,7 +832,7 @@ static int sleep_tcp_relay_connection(TCP_Connections *tcp_c, int tcp_connection memcpy(tcp_con->relay_pk, tcp_con_public_key(tcp_con->connection), CRYPTO_PUBLIC_KEY_SIZE); kill_TCP_connection(tcp_con->connection); - tcp_con->connection = NULL; + tcp_con->connection = nullptr; unsigned int i; @@ -922,7 +930,7 @@ static int tcp_response_callback(void *object, uint8_t connection_id, const uint TCP_Connection_to *con_to = get_connection(tcp_c, connections_number); - if (con_to == NULL) { + if (con_to == nullptr) { return -1; } @@ -1368,14 +1376,14 @@ int set_tcp_onion_status(TCP_Connections *tcp_c, bool status) */ TCP_Connections *new_tcp_connections(const uint8_t *secret_key, TCP_Proxy_Info *proxy_info) { - if (secret_key == NULL) { - return NULL; + if (secret_key == nullptr) { + return nullptr; } TCP_Connections *temp = (TCP_Connections *)calloc(1, sizeof(TCP_Connections)); - if (temp == NULL) { - return NULL; + if (temp == nullptr) { + return nullptr; } memcpy(temp->self_secret_key, secret_key, CRYPTO_SECRET_KEY_SIZE); @@ -1400,7 +1408,7 @@ static void do_tcp_conns(TCP_Connections *tcp_c, void *userdata) tcp_con = get_tcp_connection(tcp_c, i); // Make sure the TCP connection wasn't dropped in any of the callbacks. - assert(tcp_con != NULL); + assert(tcp_con != nullptr); if (tcp_con_status(tcp_con->connection) == TCP_CLIENT_DISCONNECTED) { if (tcp_con->status == TCP_CONN_CONNECTED) { diff --git a/protocols/Tox/libtox/src/toxcore/TCP_server.c b/protocols/Tox/libtox/src/toxcore/TCP_server.c index e86776e59e..4541fce0ce 100644 --- a/protocols/Tox/libtox/src/toxcore/TCP_server.c +++ b/protocols/Tox/libtox/src/toxcore/TCP_server.c @@ -98,9 +98,11 @@ size_t tcp_server_listen_count(const TCP_Server *tcp_server) /* This is needed to compile on Android below API 21 */ +#ifdef TCP_SERVER_USE_EPOLL #ifndef EPOLLRDHUP #define EPOLLRDHUP 0x2000 #endif +#endif /* Set the size of the connection list to numfriends. * @@ -111,7 +113,7 @@ static int realloc_connection(TCP_Server *TCP_server, uint32_t num) { if (num == 0) { free(TCP_server->accepted_connection_array); - TCP_server->accepted_connection_array = NULL; + TCP_server->accepted_connection_array = nullptr; TCP_server->size_accepted_connections = 0; return 0; } @@ -124,7 +126,7 @@ static int realloc_connection(TCP_Server *TCP_server, uint32_t num) TCP_server->accepted_connection_array, num * sizeof(TCP_Secure_Connection)); - if (new_connections == NULL) { + if (new_connections == nullptr) { return -1; } @@ -403,7 +405,7 @@ static int send_pending_data(TCP_Secure_Connection *con) con->priority_queue_start = p; if (!p) { - con->priority_queue_end = NULL; + con->priority_queue_end = nullptr; return 0; } @@ -422,7 +424,7 @@ static bool add_priority(TCP_Secure_Connection *con, const uint8_t *packet, uint return 0; } - new_list->next = NULL; + new_list->next = nullptr; new_list->size = size; new_list->sent = sent; memcpy(new_list->data, packet, size); @@ -788,7 +790,7 @@ static int rm_connection_index(TCP_Server *TCP_server, TCP_Secure_Connection *co static int handle_onion_recv_1(void *object, IP_Port dest, const uint8_t *data, uint16_t length) { TCP_Server *TCP_server = (TCP_Server *)object; - uint32_t index = dest.ip.ip6.uint32[0]; + uint32_t index = dest.ip.ip.v6.uint32[0]; if (index >= TCP_server->size_accepted_connections) { return 1; @@ -796,7 +798,7 @@ static int handle_onion_recv_1(void *object, IP_Port dest, const uint8_t *data, TCP_Secure_Connection *con = &TCP_server->accepted_connection_array[index]; - if (con->identifier != dest.ip.ip6.uint64[1]) { + if (con->identifier != dest.ip.ip.v6.uint64[1]) { return 1; } @@ -896,9 +898,9 @@ static int handle_TCP_packet(TCP_Server *TCP_server, uint32_t con_id, const uint IP_Port source; source.port = 0; // dummy initialise source.ip.family = TCP_ONION_FAMILY; - source.ip.ip6.uint32[0] = con_id; - source.ip.ip6.uint32[1] = 0; - source.ip.ip6.uint64[1] = con->identifier; + source.ip.ip.v6.uint32[0] = con_id; + source.ip.ip.v6.uint32[1] = 0; + source.ip.ip.v6.uint64[1] = con->identifier; onion_send_1(TCP_server->onion, data + 1 + CRYPTO_NONCE_SIZE, length - (1 + CRYPTO_NONCE_SIZE), source, data + 1); } @@ -1034,25 +1036,25 @@ static Socket new_listening_TCP_socket(int family, uint16_t port) TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uint16_t *ports, const uint8_t *secret_key, Onion *onion) { - if (num_sockets == 0 || ports == NULL) { - return NULL; + if (num_sockets == 0 || ports == nullptr) { + return nullptr; } if (networking_at_startup() != 0) { - return NULL; + return nullptr; } TCP_Server *temp = (TCP_Server *)calloc(1, sizeof(TCP_Server)); - if (temp == NULL) { - return NULL; + if (temp == nullptr) { + return nullptr; } temp->socks_listening = (Socket *)calloc(num_sockets, sizeof(Socket)); - if (temp->socks_listening == NULL) { + if (temp->socks_listening == nullptr) { free(temp); - return NULL; + return nullptr; } #ifdef TCP_SERVER_USE_EPOLL @@ -1061,7 +1063,7 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin if (temp->efd == -1) { free(temp->socks_listening); free(temp); - return NULL; + return nullptr; } #endif @@ -1101,7 +1103,7 @@ TCP_Server *new_TCP_server(uint8_t ipv6_enabled, uint16_t num_sockets, const uin if (temp->num_listening_socks == 0) { free(temp->socks_listening); free(temp); - return NULL; + return nullptr; } if (onion) { @@ -1429,7 +1431,7 @@ void kill_TCP_server(TCP_Server *TCP_server) } if (TCP_server->onion) { - set_callback_handle_recv_1(TCP_server->onion, NULL, NULL); + set_callback_handle_recv_1(TCP_server->onion, nullptr, nullptr); } bs_list_free(&TCP_server->accepted_key_list); diff --git a/protocols/Tox/libtox/src/toxcore/ccompat.h b/protocols/Tox/libtox/src/toxcore/ccompat.h index e72e66ae58..1ceb5a5a87 100644 --- a/protocols/Tox/libtox/src/toxcore/ccompat.h +++ b/protocols/Tox/libtox/src/toxcore/ccompat.h @@ -4,13 +4,6 @@ #ifndef CCOMPAT_H #define CCOMPAT_H -// Marking GNU extensions to avoid warnings. -#if defined(__GNUC__) -#define GNU_EXTENSION __extension__ -#else -#define GNU_EXTENSION -#endif - // Variable length arrays. // VLA(type, name, size) allocates a variable length array with automatic // storage duration. VLA_SIZE(name) evaluates to the runtime size of that array @@ -20,7 +13,7 @@ // "function") is used. Note the semantic difference: alloca'd memory does not // get freed at the end of the declaration's scope. Do not use VLA() in loops or // you may run out of stack space. -#if !defined(_MSC_VER) && __STDC_VERSION__ >= 199901L +#if !defined(_MSC_VER) && defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199901L // C99 VLAs. #define VLA(type, name, size) type name[size] #define SIZEOF_VLA sizeof @@ -29,6 +22,11 @@ // Emulation using alloca. #ifdef _WIN32 #include <malloc.h> +#elif defined(__FreeBSD__) +#include <stdlib.h> +#if !defined(alloca) && defined(__GNUC__) +#define alloca __builtin_alloca +#endif #else #include <alloca.h> #endif @@ -40,4 +38,14 @@ #endif +#ifndef __cplusplus +#define nullptr NULL +#endif + +#ifdef __GNUC__ +#define GNU_PRINTF __attribute__((__format__(__printf__, 6, 7))) +#else +#define GNU_PRINTF +#endif + #endif /* CCOMPAT_H */ diff --git a/protocols/Tox/libtox/src/toxcore/crypto_core.api.h b/protocols/Tox/libtox/src/toxcore/crypto_core.api.h index 0ba28c0c1b..bb2c0a13b8 100644 --- a/protocols/Tox/libtox/src/toxcore/crypto_core.api.h +++ b/protocols/Tox/libtox/src/toxcore/crypto_core.api.h @@ -28,6 +28,10 @@ #include <stdbool.h> #include <stdint.h> #include <stdlib.h> + +#ifdef __cplusplus +extern "C" { +#endif %} /** @@ -251,5 +255,9 @@ static void increment_nonce_number(uint8_t[CRYPTO_NONCE_SIZE] nonce, uint32_t ho static void new_symmetric_key(uint8_t[CRYPTO_SYMMETRIC_KEY_SIZE] key); %{ +#ifdef __cplusplus +} // extern "C" +#endif + #endif /* CRYPTO_CORE_H */ %} diff --git a/protocols/Tox/libtox/src/toxcore/crypto_core.c b/protocols/Tox/libtox/src/toxcore/crypto_core.c index d5333e6760..26589219ed 100644 --- a/protocols/Tox/libtox/src/toxcore/crypto_core.c +++ b/protocols/Tox/libtox/src/toxcore/crypto_core.c @@ -219,7 +219,7 @@ void increment_nonce(uint8_t *nonce) static uint32_t host_to_network(uint32_t x) { -#if BYTE_ORDER == LITTLE_ENDIAN +#if !defined(BYTE_ORDER) || BYTE_ORDER == LITTLE_ENDIAN return ((x >> 24) & 0x000000FF) | // move byte 3 to byte 0 ((x >> 8) & 0x0000FF00) | // move byte 2 to byte 1 diff --git a/protocols/Tox/libtox/src/toxcore/crypto_core.h b/protocols/Tox/libtox/src/toxcore/crypto_core.h index d2742a8b72..2c83fd255a 100644 --- a/protocols/Tox/libtox/src/toxcore/crypto_core.h +++ b/protocols/Tox/libtox/src/toxcore/crypto_core.h @@ -28,6 +28,10 @@ #include <stdint.h> #include <stdlib.h> +#ifdef __cplusplus +extern "C" { +#endif + /** * The number of bytes in a Tox public key. */ @@ -236,4 +240,8 @@ void increment_nonce_number(uint8_t *nonce, uint32_t host_order_num); */ void new_symmetric_key(uint8_t *key); +#ifdef __cplusplus +} // extern "C" +#endif + #endif /* CRYPTO_CORE_H */ diff --git a/protocols/Tox/libtox/src/toxcore/crypto_core_test.cpp b/protocols/Tox/libtox/src/toxcore/crypto_core_test.cpp new file mode 100644 index 0000000000..8f91dce842 --- /dev/null +++ b/protocols/Tox/libtox/src/toxcore/crypto_core_test.cpp @@ -0,0 +1,96 @@ +#include "crypto_core.h" + +#include <algorithm> + +#include <gtest/gtest.h> + +namespace +{ + +enum { + /** + * The size of the arrays to compare. This was chosen to take around 2000 + * CPU clocks on x86_64. + */ + CRYPTO_TEST_MEMCMP_SIZE = 1024 * 1024, // 1 MiB + /** + * The number of times we run memcmp in the test. + * + * We compute the median time taken to reduce error margins. + */ + CRYPTO_TEST_MEMCMP_ITERATIONS = 500, + /** + * The margin of error (in clocks) we allow for this test. + * + * Should be within 0.5% of ~2000 CPU clocks. In reality, the code is much + * more precise and is usually within 1 CPU clock. + */ + CRYPTO_TEST_MEMCMP_EPS = 10, +}; + +clock_t memcmp_time(void *a, void *b, size_t len) +{ + clock_t start = clock(); + crypto_memcmp(a, b, len); + return clock() - start; +} + +/** + * This function performs the actual timing. It interleaves comparison of + * equal and non-equal arrays to reduce the influence of external effects + * such as the machine being a little more busy 1 second later. + */ +void memcmp_median(void *src, void *same, void *not_same, size_t len, + clock_t *same_median, clock_t *not_same_median) +{ + clock_t same_results[CRYPTO_TEST_MEMCMP_ITERATIONS]; + clock_t not_same_results[CRYPTO_TEST_MEMCMP_ITERATIONS]; + + for (size_t i = 0; i < CRYPTO_TEST_MEMCMP_ITERATIONS; i++) { + same_results[i] = memcmp_time(src, same, len); + not_same_results[i] = memcmp_time(src, not_same, len); + } + + std::sort(same_results, same_results + CRYPTO_TEST_MEMCMP_ITERATIONS); + *same_median = same_results[CRYPTO_TEST_MEMCMP_ITERATIONS / 2]; + std::sort(not_same_results, not_same_results + CRYPTO_TEST_MEMCMP_ITERATIONS); + *not_same_median = not_same_results[CRYPTO_TEST_MEMCMP_ITERATIONS / 2]; +} + +/** + * This test checks whether crypto_memcmp takes the same time for equal and + * non-equal chunks of memory. + */ +TEST(CryptoCore, MemcmpTimingIsDataIndependent) +{ + // A random piece of memory. + uint8_t *src = new uint8_t[CRYPTO_TEST_MEMCMP_SIZE]; + random_bytes(src, CRYPTO_TEST_MEMCMP_SIZE); + + // A separate piece of memory containing the same data. + uint8_t *same = new uint8_t[CRYPTO_TEST_MEMCMP_SIZE]; + memcpy(same, src, CRYPTO_TEST_MEMCMP_SIZE); + + // Another piece of memory containing different data. + uint8_t *not_same = new uint8_t[CRYPTO_TEST_MEMCMP_SIZE]; + random_bytes(not_same, CRYPTO_TEST_MEMCMP_SIZE); + + clock_t same_median; + clock_t not_same_median; + memcmp_median(src, same, not_same, CRYPTO_TEST_MEMCMP_SIZE, &same_median, ¬_same_median); + + delete[] not_same; + delete[] same; + delete[] src; + + clock_t const delta = same_median > not_same_median + ? same_median - not_same_median + : not_same_median - same_median; + + EXPECT_LT(delta, CRYPTO_TEST_MEMCMP_EPS) + << "Delta time is too long (" << delta << " >= " << CRYPTO_TEST_MEMCMP_EPS << ")\n" + << "Time of the same data comparation: " << same_median << " clocks\n" + << "Time of the different data comparation: " << not_same_median << " clocks"; +} + +} // namespace diff --git a/protocols/Tox/libtox/src/toxcore/friend_connection.c b/protocols/Tox/libtox/src/toxcore/friend_connection.c index 2ebc0d9bc0..6f5685fb5d 100644 --- a/protocols/Tox/libtox/src/toxcore/friend_connection.c +++ b/protocols/Tox/libtox/src/toxcore/friend_connection.c @@ -88,48 +88,38 @@ Net_Crypto *friendconn_net_crypto(const Friend_Connections *fr_c) } -/* return 1 if the friendcon_id is not valid. - * return 0 if the friendcon_id is valid. +/* return true if the friendcon_id is valid. + * return false if the friendcon_id is not valid. */ -static uint8_t friendconn_id_not_valid(const Friend_Connections *fr_c, int friendcon_id) +static bool friendconn_id_valid(const Friend_Connections *fr_c, int friendcon_id) { - if ((unsigned int)friendcon_id >= fr_c->num_cons) { - return 1; - } - - if (fr_c->conns == NULL) { - return 1; - } - - if (fr_c->conns[friendcon_id].status == FRIENDCONN_STATUS_NONE) { - return 1; - } - - return 0; + return (unsigned int)friendcon_id < fr_c->num_cons && + fr_c->conns != nullptr && + fr_c->conns[friendcon_id].status != FRIENDCONN_STATUS_NONE; } /* Set the size of the friend connections list to num. * - * return -1 if realloc fails. - * return 0 if it succeeds. + * return false if realloc fails. + * return true if it succeeds. */ -static int realloc_friendconns(Friend_Connections *fr_c, uint32_t num) +static bool realloc_friendconns(Friend_Connections *fr_c, uint32_t num) { if (num == 0) { free(fr_c->conns); - fr_c->conns = NULL; - return 0; + fr_c->conns = nullptr; + return true; } Friend_Conn *newgroup_cons = (Friend_Conn *)realloc(fr_c->conns, num * sizeof(Friend_Conn)); - if (newgroup_cons == NULL) { - return -1; + if (newgroup_cons == nullptr) { + return false; } fr_c->conns = newgroup_cons; - return 0; + return true; } /* Create a new empty friend connection. @@ -139,22 +129,20 @@ static int realloc_friendconns(Friend_Connections *fr_c, uint32_t num) */ static int create_friend_conn(Friend_Connections *fr_c) { - uint32_t i; - - for (i = 0; i < fr_c->num_cons; ++i) { + for (uint32_t i = 0; i < fr_c->num_cons; ++i) { if (fr_c->conns[i].status == FRIENDCONN_STATUS_NONE) { return i; } } - int id = -1; - - if (realloc_friendconns(fr_c, fr_c->num_cons + 1) == 0) { - id = fr_c->num_cons; - ++fr_c->num_cons; - memset(&fr_c->conns[id], 0, sizeof(Friend_Conn)); + if (!realloc_friendconns(fr_c, fr_c->num_cons + 1)) { + return -1; } + const int id = fr_c->num_cons; + ++fr_c->num_cons; + memset(&fr_c->conns[id], 0, sizeof(Friend_Conn)); + return id; } @@ -165,13 +153,14 @@ static int create_friend_conn(Friend_Connections *fr_c) */ static int wipe_friend_conn(Friend_Connections *fr_c, int friendcon_id) { - if (friendconn_id_not_valid(fr_c, friendcon_id)) { + if (!friendconn_id_valid(fr_c, friendcon_id)) { return -1; } - uint32_t i; memset(&fr_c->conns[friendcon_id], 0, sizeof(Friend_Conn)); + uint32_t i; + for (i = fr_c->num_cons; i != 0; --i) { if (fr_c->conns[i - 1].status != FRIENDCONN_STATUS_NONE) { break; @@ -188,8 +177,8 @@ static int wipe_friend_conn(Friend_Connections *fr_c, int friendcon_id) static Friend_Conn *get_conn(const Friend_Connections *fr_c, int friendcon_id) { - if (friendconn_id_not_valid(fr_c, friendcon_id)) { - return 0; + if (!friendconn_id_valid(fr_c, friendcon_id)) { + return nullptr; } return &fr_c->conns[friendcon_id]; @@ -200,9 +189,7 @@ static Friend_Conn *get_conn(const Friend_Connections *fr_c, int friendcon_id) */ int getfriend_conn_id_pk(Friend_Connections *fr_c, const uint8_t *real_pk) { - uint32_t i; - - for (i = 0; i < fr_c->num_cons; ++i) { + for (uint32_t i = 0; i < fr_c->num_cons; ++i) { Friend_Conn *friend_con = get_conn(fr_c, i); if (friend_con) { @@ -222,7 +209,7 @@ int getfriend_conn_id_pk(Friend_Connections *fr_c, const uint8_t *real_pk) */ int friend_add_tcp_relay(Friend_Connections *fr_c, int friendcon_id, IP_Port ip_port, const uint8_t *public_key) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; @@ -237,11 +224,9 @@ int friend_add_tcp_relay(Friend_Connections *fr_c, int friendcon_id, IP_Port ip_ } } - unsigned int i; - - uint16_t index = friend_con->tcp_relay_counter % FRIEND_MAX_STORED_TCP_RELAYS; + const uint16_t index = friend_con->tcp_relay_counter % FRIEND_MAX_STORED_TCP_RELAYS; - for (i = 0; i < FRIEND_MAX_STORED_TCP_RELAYS; ++i) { + for (unsigned i = 0; i < FRIEND_MAX_STORED_TCP_RELAYS; ++i) { if (friend_con->tcp_relays[i].ip_port.ip.family != 0 && public_key_cmp(friend_con->tcp_relays[i].public_key, public_key) == 0) { memset(&friend_con->tcp_relays[i], 0, sizeof(Node_format)); @@ -258,16 +243,14 @@ int friend_add_tcp_relay(Friend_Connections *fr_c, int friendcon_id, IP_Port ip_ /* Connect to number saved relays for friend. */ static void connect_to_saved_tcp_relays(Friend_Connections *fr_c, int friendcon_id, unsigned int number) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return; } - unsigned int i; - - for (i = 0; (i < FRIEND_MAX_STORED_TCP_RELAYS) && (number != 0); ++i) { - uint16_t index = (friend_con->tcp_relay_counter - (i + 1)) % FRIEND_MAX_STORED_TCP_RELAYS; + for (unsigned i = 0; (i < FRIEND_MAX_STORED_TCP_RELAYS) && (number != 0); ++i) { + const uint16_t index = (friend_con->tcp_relay_counter - (i + 1)) % FRIEND_MAX_STORED_TCP_RELAYS; if (friend_con->tcp_relays[index].ip_port.ip.family) { if (add_tcp_relay_peer(fr_c->net_crypto, friend_con->crypt_connection_id, friend_con->tcp_relays[index].ip_port, @@ -280,7 +263,7 @@ static void connect_to_saved_tcp_relays(Friend_Connections *fr_c, int friendcon_ static unsigned int send_relays(Friend_Connections *fr_c, int friendcon_id) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return 0; @@ -288,19 +271,16 @@ static unsigned int send_relays(Friend_Connections *fr_c, int friendcon_id) Node_format nodes[MAX_SHARED_RELAYS]; uint8_t data[1024]; - int n, length; - - n = copy_connected_tcp_relays(fr_c->net_crypto, nodes, MAX_SHARED_RELAYS); - int i; + const int n = copy_connected_tcp_relays(fr_c->net_crypto, nodes, MAX_SHARED_RELAYS); - for (i = 0; i < n; ++i) { + for (int i = 0; i < n; ++i) { /* Associated the relays being sent with this connection. On receiving the peer will do the same which will establish the connection. */ friend_add_tcp_relay(fr_c, friendcon_id, nodes[i].ip_port, nodes[i].public_key); } - length = pack_nodes(data + 1, sizeof(data) - 1, nodes, n); + int length = pack_nodes(data + 1, sizeof(data) - 1, nodes, n); if (length <= 0) { return 0; @@ -321,7 +301,7 @@ static unsigned int send_relays(Friend_Connections *fr_c, int friendcon_id) static int tcp_relay_node_callback(void *object, uint32_t number, IP_Port ip_port, const uint8_t *public_key) { Friend_Connections *fr_c = (Friend_Connections *)object; - Friend_Conn *friend_con = get_conn(fr_c, number); + const Friend_Conn *friend_con = get_conn(fr_c, number); if (!friend_con) { return -1; @@ -338,8 +318,8 @@ static int friend_new_connection(Friend_Connections *fr_c, int friendcon_id); /* Callback for DHT ip_port changes. */ static void dht_ip_callback(void *object, int32_t number, IP_Port ip_port) { - Friend_Connections *fr_c = (Friend_Connections *)object; - Friend_Conn *friend_con = get_conn(fr_c, number); + Friend_Connections *const fr_c = (Friend_Connections *)object; + Friend_Conn *const friend_con = get_conn(fr_c, number); if (!friend_con) { return; @@ -361,7 +341,7 @@ static void dht_ip_callback(void *object, int32_t number, IP_Port ip_port) static void change_dht_pk(Friend_Connections *fr_c, int friendcon_id, const uint8_t *dht_public_key) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return; @@ -384,8 +364,8 @@ static void change_dht_pk(Friend_Connections *fr_c, int friendcon_id, const uint static int handle_status(void *object, int number, uint8_t status, void *userdata) { - Friend_Connections *fr_c = (Friend_Connections *)object; - Friend_Conn *friend_con = get_conn(fr_c, number); + Friend_Connections *const fr_c = (Friend_Connections *)object; + Friend_Conn *const friend_con = get_conn(fr_c, number); if (!friend_con) { return -1; @@ -429,8 +409,8 @@ static int handle_status(void *object, int number, uint8_t status, void *userdat /* Callback for dht public key changes. */ static void dht_pk_callback(void *object, int32_t number, const uint8_t *dht_public_key, void *userdata) { - Friend_Connections *fr_c = (Friend_Connections *)object; - Friend_Conn *friend_con = get_conn(fr_c, number); + Friend_Connections *const fr_c = (Friend_Connections *)object; + Friend_Conn *const friend_con = get_conn(fr_c, number); if (!friend_con) { return; @@ -459,7 +439,7 @@ static int handle_packet(void *object, int number, const uint8_t *data, uint16_t return -1; } - Friend_Connections *fr_c = (Friend_Connections *)object; + Friend_Connections *const fr_c = (Friend_Connections *)object; Friend_Conn *friend_con = get_conn(fr_c, number); if (!friend_con) { @@ -481,24 +461,20 @@ static int handle_packet(void *object, int number, const uint8_t *data, uint16_t if (data[0] == PACKET_ID_SHARE_RELAYS) { Node_format nodes[MAX_SHARED_RELAYS]; - int n; + const int n = unpack_nodes(nodes, MAX_SHARED_RELAYS, nullptr, data + 1, length - 1, 1); - if ((n = unpack_nodes(nodes, MAX_SHARED_RELAYS, NULL, data + 1, length - 1, 1)) == -1) { + if (n == -1) { return -1; } - int j; - - for (j = 0; j < n; j++) { + for (int j = 0; j < n; j++) { friend_add_tcp_relay(fr_c, number, nodes[j].ip_port, nodes[j].public_key); } return 0; } - unsigned int i; - - for (i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) { + for (unsigned i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) { if (friend_con->callbacks[i].data_callback) { friend_con->callbacks[i].data_callback( friend_con->callbacks[i].callback_object, @@ -521,16 +497,14 @@ static int handle_lossy_packet(void *object, int number, const uint8_t *data, ui return -1; } - Friend_Connections *fr_c = (Friend_Connections *)object; - Friend_Conn *friend_con = get_conn(fr_c, number); + Friend_Connections *const fr_c = (Friend_Connections *)object; + const Friend_Conn *friend_con = get_conn(fr_c, number); if (!friend_con) { return -1; } - unsigned int i; - - for (i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) { + for (unsigned i = 0; i < MAX_FRIEND_CONNECTION_CALLBACKS; ++i) { if (friend_con->callbacks[i].lossy_data_callback) { friend_con->callbacks[i].lossy_data_callback( friend_con->callbacks[i].callback_object, @@ -549,48 +523,47 @@ static int handle_lossy_packet(void *object, int number, const uint8_t *data, ui static int handle_new_connections(void *object, New_Connection *n_c) { - Friend_Connections *fr_c = (Friend_Connections *)object; - int friendcon_id = getfriend_conn_id_pk(fr_c, n_c->public_key); - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Connections *const fr_c = (Friend_Connections *)object; + const int friendcon_id = getfriend_conn_id_pk(fr_c, n_c->public_key); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); - if (friend_con) { - - if (friend_con->crypt_connection_id != -1) { - return -1; - } + if (!friend_con) { + return -1; + } - int id = accept_crypto_connection(fr_c->net_crypto, n_c); + if (friend_con->crypt_connection_id != -1) { + return -1; + } - if (id == -1) { - return -1; - } + const int id = accept_crypto_connection(fr_c->net_crypto, n_c); - connection_status_handler(fr_c->net_crypto, id, &handle_status, fr_c, friendcon_id); - connection_data_handler(fr_c->net_crypto, id, &handle_packet, fr_c, friendcon_id); - connection_lossy_data_handler(fr_c->net_crypto, id, &handle_lossy_packet, fr_c, friendcon_id); - friend_con->crypt_connection_id = id; + if (id == -1) { + return -1; + } - if (n_c->source.ip.family != TOX_AF_INET && n_c->source.ip.family != TOX_AF_INET6) { - set_direct_ip_port(fr_c->net_crypto, friend_con->crypt_connection_id, friend_con->dht_ip_port, 0); - } else { - friend_con->dht_ip_port = n_c->source; - friend_con->dht_ip_port_lastrecv = unix_time(); - } + connection_status_handler(fr_c->net_crypto, id, &handle_status, fr_c, friendcon_id); + connection_data_handler(fr_c->net_crypto, id, &handle_packet, fr_c, friendcon_id); + connection_lossy_data_handler(fr_c->net_crypto, id, &handle_lossy_packet, fr_c, friendcon_id); + friend_con->crypt_connection_id = id; - if (public_key_cmp(friend_con->dht_temp_pk, n_c->dht_public_key) != 0) { - change_dht_pk(fr_c, friendcon_id, n_c->dht_public_key); - } + if (n_c->source.ip.family != TOX_AF_INET && n_c->source.ip.family != TOX_AF_INET6) { + set_direct_ip_port(fr_c->net_crypto, friend_con->crypt_connection_id, friend_con->dht_ip_port, 0); + } else { + friend_con->dht_ip_port = n_c->source; + friend_con->dht_ip_port_lastrecv = unix_time(); + } - nc_dht_pk_callback(fr_c->net_crypto, id, &dht_pk_callback, fr_c, friendcon_id); - return 0; + if (public_key_cmp(friend_con->dht_temp_pk, n_c->dht_public_key) != 0) { + change_dht_pk(fr_c, friendcon_id, n_c->dht_public_key); } - return -1; + nc_dht_pk_callback(fr_c->net_crypto, id, &dht_pk_callback, fr_c, friendcon_id); + return 0; } static int friend_new_connection(Friend_Connections *fr_c, int friendcon_id) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; @@ -605,7 +578,7 @@ static int friend_new_connection(Friend_Connections *fr_c, int friendcon_id) return -1; } - int id = new_crypto_connection(fr_c->net_crypto, friend_con->real_public_key, friend_con->dht_temp_pk); + const int id = new_crypto_connection(fr_c->net_crypto, friend_con->real_public_key, friend_con->dht_temp_pk); if (id == -1) { return -1; @@ -622,14 +595,14 @@ static int friend_new_connection(Friend_Connections *fr_c, int friendcon_id) static int send_ping(const Friend_Connections *fr_c, int friendcon_id) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; } - uint8_t ping = PACKET_ID_ALIVE; - int64_t ret = write_cryptpacket(fr_c->net_crypto, friend_con->crypt_connection_id, &ping, sizeof(ping), 0); + const uint8_t ping = PACKET_ID_ALIVE; + const int64_t ret = write_cryptpacket(fr_c->net_crypto, friend_con->crypt_connection_id, &ping, sizeof(ping), 0); if (ret != -1) { friend_con->ping_lastsent = unix_time(); @@ -646,7 +619,7 @@ static int send_ping(const Friend_Connections *fr_c, int friendcon_id) */ int friend_connection_lock(Friend_Connections *fr_c, int friendcon_id) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; @@ -662,7 +635,7 @@ int friend_connection_lock(Friend_Connections *fr_c, int friendcon_id) */ unsigned int friend_con_connected(Friend_Connections *fr_c, int friendcon_id) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return 0; @@ -678,7 +651,7 @@ unsigned int friend_con_connected(Friend_Connections *fr_c, int friendcon_id) */ int get_friendcon_public_keys(uint8_t *real_pk, uint8_t *dht_temp_pk, Friend_Connections *fr_c, int friendcon_id) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; @@ -714,7 +687,7 @@ int friend_connection_callbacks(Friend_Connections *fr_c, int friendcon_id, unsi int (*lossy_data_callback)(void *object, int id, const uint8_t *data, uint16_t length, void *userdata), void *object, int number) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; @@ -741,7 +714,7 @@ int friend_connection_callbacks(Friend_Connections *fr_c, int friendcon_id, unsi */ int friend_connection_crypt_connection_id(Friend_Connections *fr_c, int friendcon_id) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; @@ -771,13 +744,13 @@ int new_friend_connection(Friend_Connections *fr_c, const uint8_t *real_public_k return -1; } - int32_t onion_friendnum = onion_addfriend(fr_c->onion_c, real_public_key); + const int32_t onion_friendnum = onion_addfriend(fr_c->onion_c, real_public_key); if (onion_friendnum == -1) { return -1; } - Friend_Conn *friend_con = &fr_c->conns[friendcon_id]; + Friend_Conn *const friend_con = &fr_c->conns[friendcon_id]; friend_con->crypt_connection_id = -1; friend_con->status = FRIENDCONN_STATUS_CONNECTING; @@ -797,7 +770,7 @@ int new_friend_connection(Friend_Connections *fr_c, const uint8_t *real_public_k */ int kill_friend_connection(Friend_Connections *fr_c, int friendcon_id) { - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; @@ -844,7 +817,7 @@ int send_friend_request_packet(Friend_Connections *fr_c, int friendcon_id, uint3 return -1; } - Friend_Conn *friend_con = get_conn(fr_c, friendcon_id); + const Friend_Conn *const friend_con = get_conn(fr_c, friendcon_id); if (!friend_con) { return -1; @@ -860,7 +833,7 @@ int send_friend_request_packet(Friend_Connections *fr_c, int friendcon_id, uint3 } packet[0] = CRYPTO_PACKET_FRIEND_REQ; - int num = send_onion_data(fr_c->onion_c, friend_con->onion_friendnum, packet, SIZEOF_VLA(packet)); + const int num = send_onion_data(fr_c->onion_c, friend_con->onion_friendnum, packet, SIZEOF_VLA(packet)); if (num <= 0) { return -1; @@ -872,14 +845,14 @@ int send_friend_request_packet(Friend_Connections *fr_c, int friendcon_id, uint3 /* Create new friend_connections instance. */ Friend_Connections *new_friend_connections(Onion_Client *onion_c, bool local_discovery_enabled) { - if (!onion_c) { - return NULL; + if (onion_c == nullptr) { + return nullptr; } - Friend_Connections *temp = (Friend_Connections *)calloc(1, sizeof(Friend_Connections)); + Friend_Connections *const temp = (Friend_Connections *)calloc(1, sizeof(Friend_Connections)); - if (temp == NULL) { - return NULL; + if (temp == nullptr) { + return nullptr; } temp->dht = onion_get_dht(onion_c); @@ -923,11 +896,10 @@ static void LANdiscovery(Friend_Connections *fr_c) /* main friend_connections loop. */ void do_friend_connections(Friend_Connections *fr_c, void *userdata) { - uint32_t i; - uint64_t temp_time = unix_time(); + const uint64_t temp_time = unix_time(); - for (i = 0; i < fr_c->num_cons; ++i) { - Friend_Conn *friend_con = get_conn(fr_c, i); + for (uint32_t i = 0; i < fr_c->num_cons; ++i) { + Friend_Conn *const friend_con = get_conn(fr_c, i); if (friend_con) { if (friend_con->status == FRIENDCONN_STATUS_CONNECTING) { @@ -980,9 +952,7 @@ void kill_friend_connections(Friend_Connections *fr_c) return; } - uint32_t i; - - for (i = 0; i < fr_c->num_cons; ++i) { + for (uint32_t i = 0; i < fr_c->num_cons; ++i) { kill_friend_connection(fr_c, i); } diff --git a/protocols/Tox/libtox/src/toxcore/friend_requests.c b/protocols/Tox/libtox/src/toxcore/friend_requests.c index 4a06654deb..13c89eae13 100644 --- a/protocols/Tox/libtox/src/toxcore/friend_requests.c +++ b/protocols/Tox/libtox/src/toxcore/friend_requests.c @@ -67,6 +67,7 @@ void callback_friendrequest(Friend_Requests *fr, void (*function)(void *, const fr->handle_friendrequest_isset = 1; fr->handle_friendrequest_object = object; } + /* Set the function used to check if a friend request should be displayed to the user or not. */ void set_filter_function(Friend_Requests *fr, int (*function)(const uint8_t *, void *), void *userdata) { @@ -87,20 +88,18 @@ static void addto_receivedlist(Friend_Requests *fr, const uint8_t *real_pk) /* Check if a friend request was already received. * - * return 0 if it did not. - * return 1 if it did. + * return false if it did not. + * return true if it did. */ -static int request_received(Friend_Requests *fr, const uint8_t *real_pk) +static bool request_received(const Friend_Requests *fr, const uint8_t *real_pk) { - uint32_t i; - - for (i = 0; i < MAX_RECEIVED_STORED; ++i) { + for (uint32_t i = 0; i < MAX_RECEIVED_STORED; ++i) { if (id_equal(fr->received_requests[i], real_pk)) { - return 1; + return true; } } - return 0; + return false; } /* Remove real pk from received_requests list. @@ -110,9 +109,7 @@ static int request_received(Friend_Requests *fr, const uint8_t *real_pk) */ int remove_request_received(Friend_Requests *fr, const uint8_t *real_pk) { - uint32_t i; - - for (i = 0; i < MAX_RECEIVED_STORED; ++i) { + for (uint32_t i = 0; i < MAX_RECEIVED_STORED; ++i) { if (id_equal(fr->received_requests[i], real_pk)) { crypto_memzero(fr->received_requests[i], CRYPTO_PUBLIC_KEY_SIZE); return 0; @@ -126,7 +123,7 @@ int remove_request_received(Friend_Requests *fr, const uint8_t *real_pk) static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, const uint8_t *packet, uint16_t length, void *userdata) { - Friend_Requests *fr = (Friend_Requests *)object; + Friend_Requests *const fr = (Friend_Requests *)object; if (length <= 1 + sizeof(fr->nospam) || length > ONION_CLIENT_MAX_DATA_SIZE) { return 1; @@ -148,19 +145,19 @@ static int friendreq_handlepacket(void *object, const uint8_t *source_pubkey, co } if (fr->filter_function) { - if ((*fr->filter_function)(source_pubkey, fr->filter_function_userdata) != 0) { + if (fr->filter_function(source_pubkey, fr->filter_function_userdata) != 0) { return 1; } } addto_receivedlist(fr, source_pubkey); - uint32_t message_len = length - sizeof(fr->nospam); + const uint32_t message_len = length - sizeof(fr->nospam); VLA(uint8_t, message, message_len + 1); memcpy(message, packet + sizeof(fr->nospam), message_len); message[SIZEOF_VLA(message) - 1] = 0; /* Be sure the message is null terminated. */ - (*fr->handle_friendrequest)(fr->handle_friendrequest_object, source_pubkey, message, message_len, userdata); + fr->handle_friendrequest(fr->handle_friendrequest_object, source_pubkey, message, message_len, userdata); return 0; } diff --git a/protocols/Tox/libtox/src/toxcore/group.c b/protocols/Tox/libtox/src/toxcore/group.c index 30f241ade5..37b4437d79 100644 --- a/protocols/Tox/libtox/src/toxcore/group.c +++ b/protocols/Tox/libtox/src/toxcore/group.c @@ -32,13 +32,13 @@ /* return 1 if the groupnumber is not valid. * return 0 if the groupnumber is valid. */ -static uint8_t groupnumber_not_valid(const Group_Chats *g_c, int groupnumber) +static uint8_t groupnumber_not_valid(const Group_Chats *g_c, uint32_t groupnumber) { - if ((unsigned int)groupnumber >= g_c->num_chats) { + if (groupnumber >= g_c->num_chats) { return 1; } - if (g_c->chats == NULL) { + if (g_c->chats == nullptr) { return 1; } @@ -59,13 +59,13 @@ static int realloc_groupchats(Group_Chats *g_c, uint32_t num) { if (num == 0) { free(g_c->chats); - g_c->chats = NULL; + g_c->chats = nullptr; return 0; } Group_c *newgroup_chats = (Group_c *)realloc(g_c->chats, num * sizeof(Group_c)); - if (newgroup_chats == NULL) { + if (newgroup_chats == nullptr) { return -1; } @@ -106,7 +106,7 @@ static int create_group_chat(Group_Chats *g_c) * return -1 on failure. * return 0 on success. */ -static int wipe_group_chat(Group_Chats *g_c, int groupnumber) +static int wipe_group_chat(Group_Chats *g_c, uint32_t groupnumber) { if (groupnumber_not_valid(g_c, groupnumber)) { return -1; @@ -129,10 +129,10 @@ static int wipe_group_chat(Group_Chats *g_c, int groupnumber) return 0; } -static Group_c *get_group_c(const Group_Chats *g_c, int groupnumber) +static Group_c *get_group_c(const Group_Chats *g_c, uint32_t groupnumber) { if (groupnumber_not_valid(g_c, groupnumber)) { - return 0; + return nullptr; } return &g_c->chats[groupnumber]; @@ -224,9 +224,10 @@ enum { }; static int friend_in_close(Group_c *g, int friendcon_id); -static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, int groupnumber, uint8_t closest, uint8_t lock); +static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, uint32_t groupnumber, uint8_t closest, + uint8_t lock); -static int add_to_closest(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk) +static int add_to_closest(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk) { Group_c *g = get_group_c(g_c, groupnumber); @@ -328,7 +329,7 @@ static unsigned int pk_in_closest_peers(Group_c *g, uint8_t *real_pk) static int send_packet_online(Friend_Connections *fr_c, int friendcon_id, uint16_t group_num, uint8_t *identifier); -static int connect_to_closest(Group_Chats *g_c, int groupnumber, void *userdata) +static int connect_to_closest(Group_Chats *g_c, uint32_t groupnumber, void *userdata) { Group_c *g = get_group_c(g_c, groupnumber); @@ -408,7 +409,7 @@ static int connect_to_closest(Group_Chats *g_c, int groupnumber, void *userdata) * return peer_index if success or peer already in chat. * return -1 if error. */ -static int addpeer(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk, +static int addpeer(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *real_pk, const uint8_t *temp_pk, uint16_t peer_number, void *userdata, bool do_gc_callback) { Group_c *g = get_group_c(g_c, groupnumber); @@ -438,7 +439,7 @@ static int addpeer(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, co Group_Peer *temp = (Group_Peer *)realloc(g->group, sizeof(Group_Peer) * (g->numpeers + 1)); - if (temp == NULL) { + if (temp == nullptr) { return -1; } @@ -454,8 +455,8 @@ static int addpeer(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, co add_to_closest(g_c, groupnumber, real_pk, temp_pk); - if (do_gc_callback && g_c->group_namelistchange) { - g_c->group_namelistchange(g_c->m, groupnumber, g->numpeers - 1, CHAT_CHANGE_PEER_ADD, userdata); + if (do_gc_callback && g_c->peer_list_changed_callback) { + g_c->peer_list_changed_callback(g_c->m, groupnumber, userdata); } if (g->peer_on_join) { @@ -465,7 +466,7 @@ static int addpeer(Group_Chats *g_c, int groupnumber, const uint8_t *real_pk, co return (g->numpeers - 1); } -static int remove_close_conn(Group_Chats *g_c, int groupnumber, int friendcon_id) +static int remove_close_conn(Group_Chats *g_c, uint32_t groupnumber, int friendcon_id) { Group_c *g = get_group_c(g_c, groupnumber); @@ -497,7 +498,7 @@ static int remove_close_conn(Group_Chats *g_c, int groupnumber, int friendcon_id * return 0 if success * return -1 if error. */ -static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index, void *userdata) +static int delpeer(Group_Chats *g_c, uint32_t groupnumber, int peer_index, void *userdata) { Group_c *g = get_group_c(g_c, groupnumber); @@ -527,7 +528,7 @@ static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index, void *user if (g->numpeers == 0) { free(g->group); - g->group = NULL; + g->group = nullptr; } else { if (g->numpeers != (uint32_t)peer_index) { memcpy(&g->group[peer_index], &g->group[g->numpeers], sizeof(Group_Peer)); @@ -535,15 +536,15 @@ static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index, void *user Group_Peer *temp = (Group_Peer *)realloc(g->group, sizeof(Group_Peer) * (g->numpeers)); - if (temp == NULL) { + if (temp == nullptr) { return -1; } g->group = temp; } - if (g_c->group_namelistchange) { - g_c->group_namelistchange(g_c->m, groupnumber, peer_index, CHAT_CHANGE_PEER_DEL, userdata); + if (g_c->peer_list_changed_callback) { + g_c->peer_list_changed_callback(g_c->m, groupnumber, userdata); } if (g->peer_on_leave) { @@ -562,7 +563,7 @@ static int delpeer(Group_Chats *g_c, int groupnumber, int peer_index, void *user * return 0 on success. * return -1 if error. */ -static int setnick(Group_Chats *g_c, int groupnumber, int peer_index, const uint8_t *nick, uint16_t nick_len, +static int setnick(Group_Chats *g_c, uint32_t groupnumber, int peer_index, const uint8_t *nick, uint16_t nick_len, void *userdata, bool do_gc_callback) { if (nick_len > MAX_NAME_LENGTH) { @@ -588,14 +589,14 @@ static int setnick(Group_Chats *g_c, int groupnumber, int peer_index, const uint g->group[peer_index].nick_len = nick_len; - if (do_gc_callback && g_c->group_namelistchange) { - g_c->group_namelistchange(g_c->m, groupnumber, peer_index, CHAT_CHANGE_PEER_NAME, userdata); + if (do_gc_callback && g_c->peer_name_callback) { + g_c->peer_name_callback(g_c->m, groupnumber, peer_index, nick, nick_len, userdata); } return 0; } -static int settitle(Group_Chats *g_c, int groupnumber, int peer_index, const uint8_t *title, uint8_t title_len, +static int settitle(Group_Chats *g_c, uint32_t groupnumber, int peer_index, const uint8_t *title, uint8_t title_len, void *userdata) { if (title_len > MAX_NAME_LENGTH || title_len == 0) { @@ -623,7 +624,7 @@ static int settitle(Group_Chats *g_c, int groupnumber, int peer_index, const uin return 0; } -static void set_conns_type_close(Group_Chats *g_c, int groupnumber, int friendcon_id, uint8_t type) +static void set_conns_type_close(Group_Chats *g_c, uint32_t groupnumber, int friendcon_id, uint8_t type) { Group_c *g = get_group_c(g_c, groupnumber); @@ -681,7 +682,8 @@ static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uin * return close index on success * return -1 on failure. */ -static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, int groupnumber, uint8_t closest, uint8_t lock) +static int add_conn_to_groupchat(Group_Chats *g_c, int friendcon_id, uint32_t groupnumber, uint8_t closest, + uint8_t lock) { Group_c *g = get_group_c(g_c, groupnumber); @@ -744,24 +746,24 @@ int add_groupchat(Group_Chats *g_c, uint8_t type) g->identifier[0] = type; g->peer_number = 0; /* Founder is peer 0. */ memcpy(g->real_pk, nc_get_self_public_key(g_c->m->net_crypto), CRYPTO_PUBLIC_KEY_SIZE); - int peer_index = addpeer(g_c, groupnumber, g->real_pk, g_c->m->dht->self_public_key, 0, NULL, false); + int peer_index = addpeer(g_c, groupnumber, g->real_pk, dht_get_self_public_key(g_c->m->dht), 0, nullptr, false); if (peer_index == -1) { return -1; } - setnick(g_c, groupnumber, peer_index, g_c->m->name, g_c->m->name_length, NULL, false); + setnick(g_c, groupnumber, peer_index, g_c->m->name, g_c->m->name_length, nullptr, false); return groupnumber; } -static int group_kill_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t peer_num); +static int group_kill_peer_send(const Group_Chats *g_c, uint32_t groupnumber, uint16_t peer_num); /* Delete a groupchat from the chats array. * * return 0 on success. * return -1 if groupnumber is invalid. */ -int del_groupchat(Group_Chats *g_c, int groupnumber) +int del_groupchat(Group_Chats *g_c, uint32_t groupnumber) { Group_c *g = get_group_c(g_c, groupnumber); @@ -804,7 +806,7 @@ int del_groupchat(Group_Chats *g_c, int groupnumber) * return -1 if groupnumber is invalid. * return -2 if peernumber is invalid. */ -int group_peer_pubkey(const Group_Chats *g_c, int groupnumber, int peernumber, uint8_t *pk) +int group_peer_pubkey(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *pk) { Group_c *g = get_group_c(g_c, groupnumber); @@ -826,7 +828,7 @@ int group_peer_pubkey(const Group_Chats *g_c, int groupnumber, int peernumber, u * return -1 if groupnumber is invalid. * return -2 if peernumber is invalid. */ -int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber) +int group_peername_size(const Group_Chats *g_c, uint32_t groupnumber, int peernumber) { Group_c *g = get_group_c(g_c, groupnumber); @@ -839,7 +841,7 @@ int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber) } if (g->group[peernumber].nick_len == 0) { - return 8; + return 0; } return g->group[peernumber].nick_len; @@ -852,7 +854,7 @@ int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber) * return -1 if groupnumber is invalid. * return -2 if peernumber is invalid. */ -int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint8_t *name) +int group_peername(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *name) { Group_c *g = get_group_c(g_c, groupnumber); @@ -865,8 +867,7 @@ int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint } if (g->group[peernumber].nick_len == 0) { - memcpy(name, "Tox User", 8); - return 8; + return 0; } memcpy(name, g->group[peernumber].nick, g->group[peernumber].nick_len); @@ -883,7 +884,7 @@ int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint * * return -1 on failure. */ -int group_names(const Group_Chats *g_c, int groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[], +int group_names(const Group_Chats *g_c, uint32_t groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[], uint16_t length) { Group_c *g = get_group_c(g_c, groupnumber); @@ -904,7 +905,7 @@ int group_names(const Group_Chats *g_c, int groupnumber, uint8_t names[][MAX_NAM /* Return the number of peers in the group chat on success. * return -1 if groupnumber is invalid. */ -int group_number_peers(const Group_Chats *g_c, int groupnumber) +int group_number_peers(const Group_Chats *g_c, uint32_t groupnumber) { Group_c *g = get_group_c(g_c, groupnumber); @@ -921,7 +922,7 @@ int group_number_peers(const Group_Chats *g_c, int groupnumber) * return -2 if peernumber is invalid. * return -3 if we are not connected to the group chat. */ -int group_peernumber_is_ours(const Group_Chats *g_c, int groupnumber, int peernumber) +int group_peernumber_is_ours(const Group_Chats *g_c, uint32_t groupnumber, int peernumber) { Group_c *g = get_group_c(g_c, groupnumber); @@ -945,7 +946,7 @@ int group_peernumber_is_ours(const Group_Chats *g_c, int groupnumber, int peernu * return -1 on failure. * return type on success. */ -int group_get_type(const Group_Chats *g_c, int groupnumber) +int group_get_type(const Group_Chats *g_c, uint32_t groupnumber) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1010,7 +1011,7 @@ static unsigned int send_lossy_group_peer(Friend_Connections *fr_c, int friendco * return -1 if groupnumber is invalid. * return -2 if invite packet failed to send. */ -int invite_friend(Group_Chats *g_c, int32_t friendnumber, int groupnumber) +int invite_friend(Group_Chats *g_c, uint32_t friendnumber, uint32_t groupnumber) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1046,7 +1047,7 @@ static unsigned int send_peer_query(Group_Chats *g_c, int friendcon_id, uint16_t * return -5 if group instance failed to initialize. * return -6 if join packet fails to send. */ -int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type, const uint8_t *data, uint16_t length) +int join_groupchat(Group_Chats *g_c, uint32_t friendnumber, uint8_t expected_type, const uint8_t *data, uint16_t length) { if (length != sizeof(uint16_t) + GROUP_IDENTIFIER_LENGTH) { return -1; @@ -1109,9 +1110,10 @@ int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type * * NOTE: Handler must return 0 if packet is to be relayed, -1 if the packet should not be relayed. * - * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber, void *group peer object (set with group_peer_set_object), const uint8_t *packet, uint16_t length) + * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber, void *group peer object (set with group_peer_set_object), const uint8_t *packet, uint16_t length) */ -void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*function)(void *, int, int, void *, +void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*function)(void *, uint32_t, uint32_t, + void *, const uint8_t *, uint16_t)) { g_c->lossy_packethandlers[byte].function = function; @@ -1119,7 +1121,7 @@ void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*fu /* Set the callback for group invites. * - * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata) + * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t type, uint8_t *data, size_t length, void *userdata) * * data of length is what needs to be passed to join_groupchat(). */ @@ -1129,9 +1131,10 @@ void g_callback_group_invite(Group_Chats *g_c, void (*function)(Messenger *m, ui g_c->invite_callback = function; } +// TODO(sudden6): function signatures in comments are incorrect /* Set the callback for group messages. * - * Function(Group_Chats *g_c, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata) + * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t friendgroupnumber, uint8_t * message, size_t length, void *userdata) */ void g_callback_group_message(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, int, const uint8_t *, size_t, void *)) @@ -1139,16 +1142,28 @@ void g_callback_group_message(Group_Chats *g_c, void (*function)(Messenger *m, u g_c->message_callback = function; } -/* Set callback function for peer name list changes. +/* Set callback function for peer nickname changes. + * + * It gets called every time a peer changes their nickname. + * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t peernumber, const uint8_t *nick, size_t nick_len, void *userdata) + */ +void g_callback_peer_name(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, const uint8_t *, + size_t, void *)) +{ + g_c->peer_name_callback = function; +} + +/* Set callback function for peer list changes. * - * It gets called every time the name list changes(new peer/name, deleted peer) - * Function(Group_Chats *g_c, int groupnumber, int peernumber, TOX_CHAT_CHANGE change, void *userdata) + * It gets called every time the name list changes(new peer, deleted peer) + * Function(Group_Chats *g_c, uint32_t groupnumber, void *userdata) */ -void g_callback_group_namelistchange(Group_Chats *g_c, void (*function)(Messenger *m, int, int, uint8_t, void *)) +void g_callback_peer_list_changed(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, void *)) { - g_c->group_namelistchange = function; + g_c->peer_list_changed_callback = function; } +// TODO(sudden6): function signatures are incorrect /* Set callback function for title changes. * * Function(Group_Chats *g_c, int groupnumber, int friendgroupnumber, uint8_t * title, uint8_t length, void *userdata) @@ -1162,12 +1177,13 @@ void g_callback_group_title(Group_Chats *g_c, void (*function)(Messenger *m, uin /* Set a function to be called when a new peer joins a group chat. * - * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber) + * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber) * * return 0 on success. * return -1 on failure. */ -int callback_groupchat_peer_new(const Group_Chats *g_c, int groupnumber, void (*function)(void *, int, int)) +int callback_groupchat_peer_new(const Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t, + uint32_t)) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1181,12 +1197,13 @@ int callback_groupchat_peer_new(const Group_Chats *g_c, int groupnumber, void (* /* Set a function to be called when a peer leaves a group chat. * - * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber, void *group peer object (set with group_peer_set_object)) + * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber, void *group peer object (set with group_peer_set_object)) * * return 0 on success. * return -1 on failure. */ -int callback_groupchat_peer_delete(Group_Chats *g_c, int groupnumber, void (*function)(void *, int, int, void *)) +int callback_groupchat_peer_delete(Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t, uint32_t, + void *)) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1205,7 +1222,7 @@ int callback_groupchat_peer_delete(Group_Chats *g_c, int groupnumber, void (*fun * return 0 on success. * return -1 on failure. */ -int callback_groupchat_delete(Group_Chats *g_c, int groupnumber, void (*function)(void *, int)) +int callback_groupchat_delete(Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t)) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1217,13 +1234,13 @@ int callback_groupchat_delete(Group_Chats *g_c, int groupnumber, void (*function return 0; } -static int send_message_group(const Group_Chats *g_c, int groupnumber, uint8_t message_id, const uint8_t *data, +static int send_message_group(const Group_Chats *g_c, uint32_t groupnumber, uint8_t message_id, const uint8_t *data, uint16_t len); #define GROUP_MESSAGE_PING_ID 0 -static int group_ping_send(const Group_Chats *g_c, int groupnumber) +static int group_ping_send(const Group_Chats *g_c, uint32_t groupnumber) { - if (send_message_group(g_c, groupnumber, GROUP_MESSAGE_PING_ID, 0, 0) > 0) { + if (send_message_group(g_c, groupnumber, GROUP_MESSAGE_PING_ID, nullptr, 0) > 0) { return 0; } @@ -1236,7 +1253,7 @@ static int group_ping_send(const Group_Chats *g_c, int groupnumber) * return 0 on success * return -1 on failure */ -static int group_new_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t peer_num, const uint8_t *real_pk, +static int group_new_peer_send(const Group_Chats *g_c, uint32_t groupnumber, uint16_t peer_num, const uint8_t *real_pk, uint8_t *temp_pk) { uint8_t packet[GROUP_MESSAGE_NEW_PEER_LENGTH]; @@ -1260,7 +1277,7 @@ static int group_new_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t * return 0 on success * return -1 on failure */ -static int group_kill_peer_send(const Group_Chats *g_c, int groupnumber, uint16_t peer_num) +static int group_kill_peer_send(const Group_Chats *g_c, uint32_t groupnumber, uint16_t peer_num) { uint8_t packet[GROUP_MESSAGE_KILL_PEER_LENGTH]; @@ -1280,7 +1297,7 @@ static int group_kill_peer_send(const Group_Chats *g_c, int groupnumber, uint16_ * return 0 on success * return -1 on failure */ -static int group_name_send(const Group_Chats *g_c, int groupnumber, const uint8_t *nick, uint16_t nick_len) +static int group_name_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *nick, uint16_t nick_len) { if (nick_len > MAX_NAME_LENGTH) { return -1; @@ -1301,7 +1318,7 @@ static int group_name_send(const Group_Chats *g_c, int groupnumber, const uint8_ * return -2 if title is too long or empty. * return -3 if packet fails to send. */ -int group_title_send(const Group_Chats *g_c, int groupnumber, const uint8_t *title, uint8_t title_len) +int group_title_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *title, uint8_t title_len) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1336,7 +1353,7 @@ int group_title_send(const Group_Chats *g_c, int groupnumber, const uint8_t *tit * return -1 of groupnumber is invalid. * return -2 if title is too long or empty. */ -int group_title_get_size(const Group_Chats *g_c, int groupnumber) +int group_title_get_size(const Group_Chats *g_c, uint32_t groupnumber) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1358,7 +1375,7 @@ int group_title_get_size(const Group_Chats *g_c, int groupnumber) * return -1 if groupnumber is invalid. * return -2 if title is too long or empty. */ -int group_title_get(const Group_Chats *g_c, int groupnumber, uint8_t *title) +int group_title_get(const Group_Chats *g_c, uint32_t groupnumber, uint8_t *title) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1524,6 +1541,11 @@ static int handle_packet_online(Group_Chats *g_c, int friendcon_id, const uint8_ } int groupnumber = get_group_num(g_c, data + sizeof(uint16_t)); + + if (groupnumber == -1) { + return -1; + } + uint16_t other_groupnum; memcpy(&other_groupnum, data, sizeof(uint16_t)); other_groupnum = net_ntohs(other_groupnum); @@ -1600,12 +1622,12 @@ static unsigned int send_peer_query(Group_Chats *g_c, int friendcon_id, uint16_t /* return number of peers sent on success. * return 0 on failure. */ -static unsigned int send_peers(Group_Chats *g_c, int groupnumber, int friendcon_id, uint16_t group_num) +static unsigned int send_peers(Group_Chats *g_c, uint32_t groupnumber, int friendcon_id, uint16_t group_num) { Group_c *g = get_group_c(g_c, groupnumber); if (!g) { - return -1; + return 0; } uint8_t packet[MAX_CRYPTO_DATA_SIZE - (1 + sizeof(uint16_t))]; @@ -1655,7 +1677,8 @@ static unsigned int send_peers(Group_Chats *g_c, int groupnumber, int friendcon_ return sent; } -static int handle_send_peers(Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length, void *userdata) +static int handle_send_peers(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length, + void *userdata) { if (length == 0) { return -1; @@ -1702,7 +1725,7 @@ static int handle_send_peers(Group_Chats *g_c, int groupnumber, const uint8_t *d return 0; } -static void handle_direct_packet(Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length, +static void handle_direct_packet(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length, int close_index, void *userdata) { if (length == 0) { @@ -1758,7 +1781,7 @@ static void handle_direct_packet(Group_Chats *g_c, int groupnumber, const uint8_ * * return number of messages sent. */ -static unsigned int send_message_all_close(const Group_Chats *g_c, int groupnumber, const uint8_t *data, +static unsigned int send_message_all_close(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length, int receiver) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1792,7 +1815,8 @@ static unsigned int send_message_all_close(const Group_Chats *g_c, int groupnumb * * return number of messages sent. */ -static unsigned int send_lossy_all_close(const Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length, +static unsigned int send_lossy_all_close(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, + uint16_t length, int receiver) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1885,7 +1909,7 @@ static unsigned int send_lossy_all_close(const Group_Chats *g_c, int groupnumber * return -3 if we are not connected to the group. * reutrn -4 if message failed to send. */ -static int send_message_group(const Group_Chats *g_c, int groupnumber, uint8_t message_id, const uint8_t *data, +static int send_message_group(const Group_Chats *g_c, uint32_t groupnumber, uint8_t message_id, const uint8_t *data, uint16_t len) { Group_c *g = get_group_c(g_c, groupnumber); @@ -1930,7 +1954,7 @@ static int send_message_group(const Group_Chats *g_c, int groupnumber, uint8_t m * return 0 on success * see: send_message_group() for error codes. */ -int group_message_send(const Group_Chats *g_c, int groupnumber, const uint8_t *message, uint16_t length) +int group_message_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *message, uint16_t length) { int ret = send_message_group(g_c, groupnumber, PACKET_ID_MESSAGE, message, length); @@ -1945,7 +1969,7 @@ int group_message_send(const Group_Chats *g_c, int groupnumber, const uint8_t *m * return 0 on success * see: send_message_group() for error codes. */ -int group_action_send(const Group_Chats *g_c, int groupnumber, const uint8_t *action, uint16_t length) +int group_action_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *action, uint16_t length) { int ret = send_message_group(g_c, groupnumber, PACKET_ID_ACTION, action, length); @@ -1956,27 +1980,12 @@ int group_action_send(const Group_Chats *g_c, int groupnumber, const uint8_t *ac return ret; } -/* send a group correction message - * return 0 on success - * see: send_message_group() for error codes. - */ -int group_correction_send(const Group_Chats *g_c, int groupnumber, const uint8_t *action, uint16_t length) -{ - int ret = send_message_group(g_c, groupnumber, PACKET_ID_CORRECTION, action, length); - - if (ret > 0) { - return 0; - } - - return ret; -} - /* High level function to send custom lossy packets. * * return -1 on failure. * return 0 on success. */ -int send_group_lossy_packet(const Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length) +int send_group_lossy_packet(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length) { // TODO(irungentoo): length check here? Group_c *g = get_group_c(g_c, groupnumber); @@ -2000,7 +2009,7 @@ int send_group_lossy_packet(const Group_Chats *g_c, int groupnumber, const uint8 return 0; } -static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length, +static void handle_message_packet_group(Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length, int close_index, void *userdata) { if (length < sizeof(uint16_t) + sizeof(uint32_t) + 1) { @@ -2098,9 +2107,24 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const } break; - case PACKET_ID_MESSAGE: - case PACKET_ID_ACTION: - case PACKET_ID_CORRECTION: { + case PACKET_ID_MESSAGE: { + if (msg_data_len == 0) { + return; + } + + VLA(uint8_t, newmsg, msg_data_len + 1); + memcpy(newmsg, msg_data, msg_data_len); + newmsg[msg_data_len] = 0; + + // TODO(irungentoo): + if (g_c->message_callback) { + g_c->message_callback(g_c->m, groupnumber, index, 0, newmsg, msg_data_len, userdata); + } + + break; + } + + case PACKET_ID_ACTION: { if (msg_data_len == 0) { return; } @@ -2111,9 +2135,7 @@ static void handle_message_packet_group(Group_Chats *g_c, int groupnumber, const // TODO(irungentoo): if (g_c->message_callback) { - uint8_t chat_message_id = message_id - PACKET_ID_MESSAGE; - g_c->message_callback(g_c->m, groupnumber, index, chat_message_id, - newmsg, msg_data_len, userdata); + g_c->message_callback(g_c->m, groupnumber, index, 1, newmsg, msg_data_len, userdata); } break; @@ -2188,6 +2210,7 @@ static int g_handle_packet(void *object, int friendcon_id, const uint8_t *data, static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16_t message_number) { if (peer_index == -1) { + // TODO(sudden6): invalid return value return -1; } @@ -2208,6 +2231,7 @@ static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16 } if ((uint16_t)(message_number - g->group[peer_index].bottom_lossy_number) > (1 << 15)) { + // TODO(sudden6): invalid return value return -1; } @@ -2218,10 +2242,9 @@ static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16 g->group[peer_index].top_lossy_number = message_number; g->group[peer_index].bottom_lossy_number = (message_number - MAX_LOSSY_COUNT) + 1; g->group[peer_index].recv_lossy[message_number % MAX_LOSSY_COUNT] = 1; - return 0; - } - if (top_distance < MAX_LOSSY_COUNT) { + return 0; + } else { // top_distance < MAX_LOSSY_COUNT unsigned int i; for (i = g->group[peer_index].bottom_lossy_number; i != (g->group[peer_index].bottom_lossy_number + top_distance); @@ -2232,10 +2255,9 @@ static unsigned int lossy_packet_not_received(Group_c *g, int peer_index, uint16 g->group[peer_index].top_lossy_number = message_number; g->group[peer_index].bottom_lossy_number = (message_number - MAX_LOSSY_COUNT) + 1; g->group[peer_index].recv_lossy[message_number % MAX_LOSSY_COUNT] = 1; + return 0; } - - return -1; } static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uint16_t length, void *userdata) @@ -2308,7 +2330,7 @@ static int handle_lossy(void *object, int friendcon_id, const uint8_t *data, uin * return 0 on success. * return -1 on failure */ -int group_set_object(const Group_Chats *g_c, int groupnumber, void *object) +int group_set_object(const Group_Chats *g_c, uint32_t groupnumber, void *object) { Group_c *g = get_group_c(g_c, groupnumber); @@ -2325,7 +2347,7 @@ int group_set_object(const Group_Chats *g_c, int groupnumber, void *object) * return 0 on success. * return -1 on failure */ -int group_peer_set_object(const Group_Chats *g_c, int groupnumber, int peernumber, void *object) +int group_peer_set_object(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, void *object) { Group_c *g = get_group_c(g_c, groupnumber); @@ -2346,12 +2368,12 @@ int group_peer_set_object(const Group_Chats *g_c, int groupnumber, int peernumbe * return NULL on failure. * return object on success. */ -void *group_get_object(const Group_Chats *g_c, int groupnumber) +void *group_get_object(const Group_Chats *g_c, uint32_t groupnumber) { Group_c *g = get_group_c(g_c, groupnumber); if (!g) { - return NULL; + return nullptr; } return g->object; @@ -2362,16 +2384,16 @@ void *group_get_object(const Group_Chats *g_c, int groupnumber) * return NULL on failure. * return object on success. */ -void *group_peer_get_object(const Group_Chats *g_c, int groupnumber, int peernumber) +void *group_peer_get_object(const Group_Chats *g_c, uint32_t groupnumber, int peernumber) { Group_c *g = get_group_c(g_c, groupnumber); if (!g) { - return NULL; + return nullptr; } if ((uint32_t)peernumber >= g->numpeers) { - return NULL; + return nullptr; } return g->group[peernumber].object; @@ -2380,7 +2402,7 @@ void *group_peer_get_object(const Group_Chats *g_c, int groupnumber, int peernum /* Interval in seconds to send ping messages */ #define GROUP_PING_INTERVAL 20 -static int ping_groupchat(Group_Chats *g_c, int groupnumber) +static int ping_groupchat(Group_Chats *g_c, uint32_t groupnumber) { Group_c *g = get_group_c(g_c, groupnumber); @@ -2397,7 +2419,7 @@ static int ping_groupchat(Group_Chats *g_c, int groupnumber) return 0; } -static int groupchat_clear_timedout(Group_Chats *g_c, int groupnumber, void *userdata) +static int groupchat_clear_timedout(Group_Chats *g_c, uint32_t groupnumber, void *userdata) { Group_c *g = get_group_c(g_c, groupnumber); @@ -2412,7 +2434,7 @@ static int groupchat_clear_timedout(Group_Chats *g_c, int groupnumber, void *use delpeer(g_c, groupnumber, i, userdata); } - if (g->group == NULL || i >= g->numpeers) { + if (g->group == nullptr || i >= g->numpeers) { break; } } @@ -2443,13 +2465,13 @@ void send_name_all_groups(Group_Chats *g_c) Group_Chats *new_groupchats(Messenger *m) { if (!m) { - return NULL; + return nullptr; } Group_Chats *temp = (Group_Chats *)calloc(1, sizeof(Group_Chats)); - if (temp == NULL) { - return NULL; + if (temp == nullptr) { + return nullptr; } temp->m = m; @@ -2491,8 +2513,8 @@ void kill_groupchats(Group_Chats *g_c) del_groupchat(g_c, i); } - m_callback_conference_invite(g_c->m, NULL); - g_c->m->conferences_object = NULL; + m_callback_conference_invite(g_c->m, nullptr); + g_c->m->conferences_object = nullptr; free(g_c); } diff --git a/protocols/Tox/libtox/src/toxcore/group.h b/protocols/Tox/libtox/src/toxcore/group.h index 6c0baebffb..a81dac39db 100644 --- a/protocols/Tox/libtox/src/toxcore/group.h +++ b/protocols/Tox/libtox/src/toxcore/group.h @@ -103,9 +103,9 @@ typedef struct { void *object; - void (*peer_on_join)(void *, int, int); - void (*peer_on_leave)(void *, int, int, void *); - void (*group_on_delete)(void *, int); + void (*peer_on_join)(void *, uint32_t, uint32_t); + void (*peer_on_leave)(void *, uint32_t, uint32_t, void *); + void (*group_on_delete)(void *, uint32_t); } Group_c; typedef struct { @@ -117,17 +117,18 @@ typedef struct { void (*invite_callback)(Messenger *m, uint32_t, int, const uint8_t *, size_t, void *); void (*message_callback)(Messenger *m, uint32_t, uint32_t, int, const uint8_t *, size_t, void *); - void (*group_namelistchange)(Messenger *m, int, int, uint8_t, void *); + void (*peer_name_callback)(Messenger *m, uint32_t, uint32_t, const uint8_t *, size_t, void *); + void (*peer_list_changed_callback)(Messenger *m, uint32_t, void *); void (*title_callback)(Messenger *m, uint32_t, uint32_t, const uint8_t *, size_t, void *); struct { - int (*function)(void *, int, int, void *, const uint8_t *, uint16_t); + int (*function)(void *, uint32_t, uint32_t, void *, const uint8_t *, uint16_t); } lossy_packethandlers[256]; } Group_Chats; /* Set the callback for group invites. * - * Function(Group_Chats *g_c, int32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata) + * Function(Group_Chats *g_c, uint32_t friendnumber, uint8_t type, uint8_t *data, uint16_t length, void *userdata) * * data of length is what needs to be passed to join_groupchat(). */ @@ -136,7 +137,7 @@ void g_callback_group_invite(Group_Chats *g_c, void (*function)(Messenger *m, ui /* Set the callback for group messages. * - * Function(Group_Chats *g_c, int groupnumber, int friendgroupnumber, uint8_t * message, uint16_t length, void *userdata) + * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t friendgroupnumber, uint8_t * message, uint16_t length, void *userdata) */ void g_callback_group_message(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, int, const uint8_t *, size_t, void *)); @@ -144,23 +145,26 @@ void g_callback_group_message(Group_Chats *g_c, void (*function)(Messenger *m, u /* Set callback function for title changes. * - * Function(Group_Chats *g_c, int groupnumber, int friendgroupnumber, uint8_t * title, uint8_t length, void *userdata) + * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t friendgroupnumber, uint8_t * title, uint8_t length, void *userdata) * if friendgroupnumber == -1, then author is unknown (e.g. initial joining the group) */ void g_callback_group_title(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, const uint8_t *, size_t, void *)); -/* Set callback function for peer name list changes. +/* Set callback function for peer nickname changes. * - * It gets called every time the name list changes(new peer/name, deleted peer) - * Function(Group_Chats *g_c, int groupnumber, int peernumber, TOX_CHAT_CHANGE change, void *userdata) + * It gets called every time a peer changes their nickname. + * Function(Group_Chats *g_c, uint32_t groupnumber, uint32_t peernumber, const uint8_t *nick, size_t nick_len, void *userdata) */ -enum { - CHAT_CHANGE_PEER_ADD, - CHAT_CHANGE_PEER_DEL, - CHAT_CHANGE_PEER_NAME, -}; -void g_callback_group_namelistchange(Group_Chats *g_c, void (*function)(Messenger *m, int, int, uint8_t, void *)); +void g_callback_peer_name(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, uint32_t, const uint8_t *, + size_t, void *)); + +/* Set callback function for peer list changes. + * + * It gets called every time the name list changes(new peer, deleted peer) + * Function(Group_Chats *g_c, uint32_t groupnumber, void *userdata) + */ +void g_callback_peer_list_changed(Group_Chats *g_c, void (*function)(Messenger *m, uint32_t, void *)); /* Creates a new groupchat and puts it in the chats array. * @@ -176,7 +180,7 @@ int add_groupchat(Group_Chats *g_c, uint8_t type); * return 0 on success. * return -1 if groupnumber is invalid. */ -int del_groupchat(Group_Chats *g_c, int groupnumber); +int del_groupchat(Group_Chats *g_c, uint32_t groupnumber); /* Copy the public key of peernumber who is in groupnumber to pk. * pk must be CRYPTO_PUBLIC_KEY_SIZE long. @@ -185,7 +189,7 @@ int del_groupchat(Group_Chats *g_c, int groupnumber); * return -1 if groupnumber is invalid. * return -2 if peernumber is invalid. */ -int group_peer_pubkey(const Group_Chats *g_c, int groupnumber, int peernumber, uint8_t *pk); +int group_peer_pubkey(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *pk); /* * Return the size of peernumber's name. @@ -193,7 +197,7 @@ int group_peer_pubkey(const Group_Chats *g_c, int groupnumber, int peernumber, u * return -1 if groupnumber is invalid. * return -2 if peernumber is invalid. */ -int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber); +int group_peername_size(const Group_Chats *g_c, uint32_t groupnumber, int32_t peernumber); /* Copy the name of peernumber who is in groupnumber to name. * name must be at least MAX_NAME_LENGTH long. @@ -202,7 +206,7 @@ int group_peername_size(const Group_Chats *g_c, int groupnumber, int peernumber) * return -1 if groupnumber is invalid. * return -2 if peernumber is invalid. */ -int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint8_t *name); +int group_peername(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, uint8_t *name); /* invite friendnumber to groupnumber * @@ -210,7 +214,7 @@ int group_peername(const Group_Chats *g_c, int groupnumber, int peernumber, uint * return -1 if groupnumber is invalid. * return -2 if invite packet failed to send. */ -int invite_friend(Group_Chats *g_c, int32_t friendnumber, int groupnumber); +int invite_friend(Group_Chats *g_c, uint32_t friendnumber, uint32_t groupnumber); /* Join a group (you need to have been invited first.) * @@ -224,25 +228,20 @@ int invite_friend(Group_Chats *g_c, int32_t friendnumber, int groupnumber); * return -5 if group instance failed to initialize. * return -6 if join packet fails to send. */ -int join_groupchat(Group_Chats *g_c, int32_t friendnumber, uint8_t expected_type, const uint8_t *data, uint16_t length); +int join_groupchat(Group_Chats *g_c, uint32_t friendnumber, uint8_t expected_type, const uint8_t *data, + uint16_t length); /* send a group message * return 0 on success * see: send_message_group() for error codes. */ -int group_message_send(const Group_Chats *g_c, int groupnumber, const uint8_t *message, uint16_t length); +int group_message_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *message, uint16_t length); /* send a group action * return 0 on success * see: send_message_group() for error codes. */ -int group_action_send(const Group_Chats *g_c, int groupnumber, const uint8_t *action, uint16_t length); - -/* send a group correction message - * return 0 on success - * see: send_message_group() for error codes. - */ -int group_correction_send(const Group_Chats *g_c, int groupnumber, const uint8_t *action, uint16_t length); +int group_action_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *action, uint16_t length); /* set the group's title, limited to MAX_NAME_LENGTH * return 0 on success @@ -250,14 +249,14 @@ int group_correction_send(const Group_Chats *g_c, int groupnumber, const uint8_t * return -2 if title is too long or empty. * return -3 if packet fails to send. */ -int group_title_send(const Group_Chats *g_c, int groupnumber, const uint8_t *title, uint8_t title_len); +int group_title_send(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *title, uint8_t title_len); /* return the group's title size. * return -1 of groupnumber is invalid. * return -2 if title is too long or empty. */ -int group_title_get_size(const Group_Chats *g_c, int groupnumber); +int group_title_get_size(const Group_Chats *g_c, uint32_t groupnumber); /* Get group title from groupnumber and put it in title. * Title needs to be a valid memory location with a size of at least MAX_NAME_LENGTH (128) bytes. @@ -266,12 +265,12 @@ int group_title_get_size(const Group_Chats *g_c, int groupnumber); * return -1 if groupnumber is invalid. * return -2 if title is too long or empty. */ -int group_title_get(const Group_Chats *g_c, int groupnumber, uint8_t *title); +int group_title_get(const Group_Chats *g_c, uint32_t groupnumber, uint8_t *title); /* Return the number of peers in the group chat on success. * return -1 if groupnumber is invalid. */ -int group_number_peers(const Group_Chats *g_c, int groupnumber); +int group_number_peers(const Group_Chats *g_c, uint32_t groupnumber); /* return 1 if the peernumber corresponds to ours. * return 0 if the peernumber is not ours. @@ -279,7 +278,7 @@ int group_number_peers(const Group_Chats *g_c, int groupnumber); * return -2 if peernumber is invalid. * return -3 if we are not connected to the group chat. */ -int group_peernumber_is_ours(const Group_Chats *g_c, int groupnumber, int peernumber); +int group_peernumber_is_ours(const Group_Chats *g_c, uint32_t groupnumber, int peernumber); /* List all the peers in the group chat. * @@ -291,16 +290,17 @@ int group_peernumber_is_ours(const Group_Chats *g_c, int groupnumber, int peernu * * return -1 on failure. */ -int group_names(const Group_Chats *g_c, int groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[], +int group_names(const Group_Chats *g_c, uint32_t groupnumber, uint8_t names[][MAX_NAME_LENGTH], uint16_t lengths[], uint16_t length); /* Set handlers for custom lossy packets. * * NOTE: Handler must return 0 if packet is to be relayed, -1 if the packet should not be relayed. * - * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber, void *group peer object (set with group_peer_set_object), const uint8_t *packet, uint16_t length) + * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber, void *group peer object (set with group_peer_set_object), const uint8_t *packet, uint16_t length) */ -void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*function)(void *, int, int, void *, +void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*function)(void *, uint32_t, uint32_t, + void *, const uint8_t *, uint16_t)); /* High level function to send custom lossy packets. @@ -308,7 +308,7 @@ void group_lossy_packet_registerhandler(Group_Chats *g_c, uint8_t byte, int (*fu * return -1 on failure. * return 0 on success. */ -int send_group_lossy_packet(const Group_Chats *g_c, int groupnumber, const uint8_t *data, uint16_t length); +int send_group_lossy_packet(const Group_Chats *g_c, uint32_t groupnumber, const uint8_t *data, uint16_t length); /* Return the number of chats in the instance m. * You should use this to determine how much memory to allocate @@ -328,7 +328,7 @@ uint32_t copy_chatlist(Group_Chats *g_c, uint32_t *out_list, uint32_t list_size) * return -1 on failure. * return type on success. */ -int group_get_type(const Group_Chats *g_c, int groupnumber); +int group_get_type(const Group_Chats *g_c, uint32_t groupnumber); /* Send current name (set in messenger) to all online groups. */ @@ -339,28 +339,28 @@ void send_name_all_groups(Group_Chats *g_c); * return 0 on success. * return -1 on failure */ -int group_set_object(const Group_Chats *g_c, int groupnumber, void *object); +int group_set_object(const Group_Chats *g_c, uint32_t groupnumber, void *object); /* Set the object that is tied to the group peer. * * return 0 on success. * return -1 on failure */ -int group_peer_set_object(const Group_Chats *g_c, int groupnumber, int peernumber, void *object); +int group_peer_set_object(const Group_Chats *g_c, uint32_t groupnumber, int peernumber, void *object); /* Return the object tide to the group chat previously set by group_set_object. * * return NULL on failure. * return object on success. */ -void *group_get_object(const Group_Chats *g_c, int groupnumber); +void *group_get_object(const Group_Chats *g_c, uint32_t groupnumber); /* Return the object tide to the group chat peer previously set by group_peer_set_object. * * return NULL on failure. * return object on success. */ -void *group_peer_get_object(const Group_Chats *g_c, int groupnumber, int peernumber); +void *group_peer_get_object(const Group_Chats *g_c, uint32_t groupnumber, int peernumber); /* Set a function to be called when a new peer joins a group chat. * @@ -369,25 +369,27 @@ void *group_peer_get_object(const Group_Chats *g_c, int groupnumber, int peernum * return 0 on success. * return -1 on failure. */ -int callback_groupchat_peer_new(const Group_Chats *g_c, int groupnumber, void (*function)(void *, int, int)); +int callback_groupchat_peer_new(const Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t, + uint32_t)); /* Set a function to be called when a peer leaves a group chat. * - * Function(void *group object (set with group_set_object), int groupnumber, int friendgroupnumber, void *group peer object (set with group_peer_set_object)) + * Function(void *group object (set with group_set_object), uint32_t groupnumber, uint32_t friendgroupnumber, void *group peer object (set with group_peer_set_object)) * * return 0 on success. * return -1 on failure. */ -int callback_groupchat_peer_delete(Group_Chats *g_c, int groupnumber, void (*function)(void *, int, int, void *)); +int callback_groupchat_peer_delete(Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t, uint32_t, + void *)); /* Set a function to be called when the group chat is deleted. * - * Function(void *group object (set with group_set_object), int groupnumber) + * Function(void *group object (set with group_set_object), uint32_t groupnumber) * * return 0 on success. * return -1 on failure. */ -int callback_groupchat_delete(Group_Chats *g_c, int groupnumber, void (*function)(void *, int)); +int callback_groupchat_delete(Group_Chats *g_c, uint32_t groupnumber, void (*function)(void *, uint32_t)); /* Create new groupchat instance. */ Group_Chats *new_groupchats(Messenger *m); diff --git a/protocols/Tox/libtox/src/toxcore/list.c b/protocols/Tox/libtox/src/toxcore/list.c index 36d609fbd1..8fd1f5fb4c 100644 --- a/protocols/Tox/libtox/src/toxcore/list.c +++ b/protocols/Tox/libtox/src/toxcore/list.c @@ -29,6 +29,8 @@ #include "list.h" +#include "ccompat.h" + /* Basically, the elements in the list are placed in order so that they can be searched for easily * -each element is seen as a big-endian integer when ordering them * -the ids array is maintained so that each id always matches @@ -148,8 +150,8 @@ int bs_list_init(BS_LIST *list, uint32_t element_size, uint32_t initial_capacity list->n = 0; list->element_size = element_size; list->capacity = 0; - list->data = NULL; - list->ids = NULL; + list->data = nullptr; + list->ids = nullptr; if (initial_capacity != 0) { if (!resize(list, initial_capacity)) { @@ -166,10 +168,10 @@ void bs_list_free(BS_LIST *list) { //free both arrays free(list->data); - list->data = NULL; + list->data = nullptr; free(list->ids); - list->ids = NULL; + list->ids = nullptr; } int bs_list_find(const BS_LIST *list, const uint8_t *data) diff --git a/protocols/Tox/libtox/src/toxcore/logger.h b/protocols/Tox/libtox/src/toxcore/logger.h index 8c8a639bec..b3a8f7dc28 100644 --- a/protocols/Tox/libtox/src/toxcore/logger.h +++ b/protocols/Tox/libtox/src/toxcore/logger.h @@ -26,6 +26,8 @@ #include <stdint.h> +#include "ccompat.h" + #ifndef MIN_LOGGER_LEVEL #define MIN_LOGGER_LEVEL LOG_INFO #endif @@ -59,8 +61,8 @@ void logger_callback_log(Logger *log, logger_cb *function, void *context, void * /** * Main write function. If logging disabled does nothing. */ -void logger_write(Logger *log, LOGGER_LEVEL level, const char *file, int line, const char *func, const char *format, - ...); +void logger_write( + Logger *log, LOGGER_LEVEL level, const char *file, int line, const char *func, const char *format, ...) GNU_PRINTF; #define LOGGER_WRITE(log, level, ...) \ diff --git a/protocols/Tox/libtox/src/toxcore/net_crypto.c b/protocols/Tox/libtox/src/toxcore/net_crypto.c index 521dad2f1c..65c81d92a0 100644 --- a/protocols/Tox/libtox/src/toxcore/net_crypto.c +++ b/protocols/Tox/libtox/src/toxcore/net_crypto.c @@ -180,7 +180,7 @@ static uint8_t crypt_connection_id_not_valid(const Net_Crypto *c, int crypt_conn return 1; } - if (c->crypto_connections == NULL) { + if (c->crypto_connections == nullptr) { return 1; } @@ -223,7 +223,7 @@ static int create_cookie_request(const Net_Crypto *c, uint8_t *packet, uint8_t * uint8_t nonce[CRYPTO_NONCE_SIZE]; random_nonce(nonce); packet[0] = NET_PACKET_COOKIE_REQUEST; - memcpy(packet + 1, c->dht->self_public_key, CRYPTO_PUBLIC_KEY_SIZE); + memcpy(packet + 1, dht_get_self_public_key(c->dht), CRYPTO_PUBLIC_KEY_SIZE); memcpy(packet + 1 + CRYPTO_PUBLIC_KEY_SIZE, nonce, CRYPTO_NONCE_SIZE); int len = encrypt_data_symmetric(shared_key, nonce, plain, sizeof(plain), packet + 1 + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_NONCE_SIZE); @@ -362,7 +362,7 @@ static int udp_handle_cookie_request(void *object, IP_Port source, const uint8_t return 1; } - if ((uint32_t)sendpacket(c->dht->net, source, data, sizeof(data)) != sizeof(data)) { + if ((uint32_t)sendpacket(dht_get_net(c->dht), source, data, sizeof(data)) != sizeof(data)) { return 1; } @@ -551,7 +551,7 @@ static int handle_crypto_handshake(const Net_Crypto *c, uint8_t *nonce, uint8_t static Crypto_Connection *get_crypto_connection(const Net_Crypto *c, int crypt_connection_id) { if (crypt_connection_id_not_valid(c, crypt_connection_id)) { - return 0; + return nullptr; } return &c->crypto_connections[crypt_connection_id]; @@ -567,7 +567,7 @@ static int add_ip_port_connection(Net_Crypto *c, int crypt_connection_id, IP_Por { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -607,7 +607,7 @@ static IP_Port return_ip_port_connection(Net_Crypto *c, int crypt_connection_id) Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return empty; } @@ -647,7 +647,7 @@ static int send_packet_to(Net_Crypto *c, int crypt_connection_id, const uint8_t // TODO(irungentoo): TCP, etc... Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -659,10 +659,10 @@ static int send_packet_to(Net_Crypto *c, int crypt_connection_id, const uint8_t // TODO(irungentoo): on bad networks, direct connections might not last indefinitely. if (ip_port.ip.family != 0) { bool direct_connected = 0; - crypto_connection_status(c, crypt_connection_id, &direct_connected, NULL); + crypto_connection_status(c, crypt_connection_id, &direct_connected, nullptr); if (direct_connected) { - if ((uint32_t)sendpacket(c->dht->net, ip_port, data, length) == length) { + if ((uint32_t)sendpacket(dht_get_net(c->dht), ip_port, data, length) == length) { pthread_mutex_unlock(&conn->mutex); return 0; } @@ -676,7 +676,7 @@ static int send_packet_to(Net_Crypto *c, int crypt_connection_id, const uint8_t if ((((UDP_DIRECT_TIMEOUT / 2) + conn->direct_send_attempt_time) > current_time && length < 96) || data[0] == NET_PACKET_COOKIE_REQUEST || data[0] == NET_PACKET_CRYPTO_HS) { - if ((uint32_t)sendpacket(c->dht->net, ip_port, data, length) == length) { + if ((uint32_t)sendpacket(dht_get_net(c->dht), ip_port, data, length) == length) { direct_send_attempt = 1; conn->direct_send_attempt_time = unix_time(); } @@ -733,7 +733,7 @@ static int add_data_to_buffer(Packets_Array *array, uint32_t number, const Packe Packet_Data *new_d = (Packet_Data *)malloc(sizeof(Packet_Data)); - if (new_d == NULL) { + if (new_d == nullptr) { return -1; } @@ -784,7 +784,7 @@ static int64_t add_data_end_of_buffer(Packets_Array *array, const Packet_Data *d Packet_Data *new_d = (Packet_Data *)malloc(sizeof(Packet_Data)); - if (new_d == NULL) { + if (new_d == nullptr) { return -1; } @@ -816,7 +816,7 @@ static int64_t read_data_beg_buffer(Packets_Array *array, Packet_Data *data) uint32_t id = array->buffer_start; ++array->buffer_start; free(array->buffer[num]); - array->buffer[num] = NULL; + array->buffer[num] = nullptr; return id; } @@ -840,7 +840,7 @@ static int clear_buffer_until(Packets_Array *array, uint32_t number) if (array->buffer[num]) { free(array->buffer[num]); - array->buffer[num] = NULL; + array->buffer[num] = nullptr; } } @@ -857,7 +857,7 @@ static int clear_buffer(Packets_Array *array) if (array->buffer[num]) { free(array->buffer[num]); - array->buffer[num] = NULL; + array->buffer[num] = nullptr; } } @@ -996,7 +996,7 @@ static int handle_request_packet(Packets_Array *send_array, const uint8_t *data, } free(send_array->buffer[num]); - send_array->buffer[num] = NULL; + send_array->buffer[num] = nullptr; } } @@ -1038,7 +1038,7 @@ static int send_data_packet(Net_Crypto *c, int crypt_connection_id, const uint8_ Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1087,14 +1087,14 @@ static int reset_max_speed_reached(Net_Crypto *c, int crypt_connection_id) { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } /* If last packet send failed, try to send packet again. If sending it fails we won't be able to send the new packet. */ if (conn->maximum_speed_reached) { - Packet_Data *dt = NULL; + Packet_Data *dt = nullptr; uint32_t packet_num = conn->send_array.buffer_end - 1; int ret = get_data_pointer(&conn->send_array, &dt, packet_num); @@ -1133,7 +1133,7 @@ static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, cons Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1162,7 +1162,7 @@ static int64_t send_lossless_packet(Net_Crypto *c, int crypt_connection_id, cons } if (send_data_packet_helper(c, crypt_connection_id, conn->recv_array.buffer_start, packet_num, data, length) == 0) { - Packet_Data *dt1 = NULL; + Packet_Data *dt1 = nullptr; if (get_data_pointer(&conn->send_array, &dt1, packet_num) == 1) { dt1->sent_time = current_time_monotonic(); @@ -1203,7 +1203,7 @@ static int handle_data_packet(const Net_Crypto *c, int crypt_connection_id, uint Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1238,7 +1238,7 @@ static int send_request_packet(Net_Crypto *c, int crypt_connection_id) { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1266,7 +1266,7 @@ static int send_requested_packets(Net_Crypto *c, int crypt_connection_id, uint32 Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1318,13 +1318,13 @@ static int new_temp_packet(const Net_Crypto *c, int crypt_connection_id, const u Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } uint8_t *temp_packet = (uint8_t *)malloc(length); - if (temp_packet == 0) { + if (temp_packet == nullptr) { return -1; } @@ -1349,7 +1349,7 @@ static int clear_temp_packet(const Net_Crypto *c, int crypt_connection_id) { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1357,7 +1357,7 @@ static int clear_temp_packet(const Net_Crypto *c, int crypt_connection_id) free(conn->temp_packet); } - conn->temp_packet = 0; + conn->temp_packet = nullptr; conn->temp_packet_length = 0; conn->temp_packet_sent_time = 0; conn->temp_packet_num_sent = 0; @@ -1374,7 +1374,7 @@ static int send_temp_packet(Net_Crypto *c, int crypt_connection_id) { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1402,7 +1402,7 @@ static int create_send_handshake(Net_Crypto *c, int crypt_connection_id, const u { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1430,7 +1430,7 @@ static int send_kill_packet(Net_Crypto *c, int crypt_connection_id) { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1443,7 +1443,7 @@ static void connection_kill(Net_Crypto *c, int crypt_connection_id, void *userda { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return; } @@ -1469,7 +1469,7 @@ static int handle_data_packet_core(Net_Crypto *c, int crypt_connection_id, const Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1542,8 +1542,6 @@ static int handle_data_packet_core(Net_Crypto *c, int crypt_connection_id, const return -1; } - // else { /* TODO(irungentoo): ? */ } - set_buffer_end(&conn->recv_array, num); } else if (real_data[0] >= CRYPTO_RESERVED_PACKETS && real_data[0] < PACKET_ID_LOSSY_RANGE_START) { Packet_Data dt; @@ -1571,7 +1569,7 @@ static int handle_data_packet_core(Net_Crypto *c, int crypt_connection_id, const /* conn might get killed in callback. */ conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } } @@ -1616,7 +1614,7 @@ static int handle_packet_connection(Net_Crypto *c, int crypt_connection_id, cons Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1702,14 +1700,14 @@ static int realloc_cryptoconnection(Net_Crypto *c, uint32_t num) { if (num == 0) { free(c->crypto_connections); - c->crypto_connections = NULL; + c->crypto_connections = nullptr; return 0; } Crypto_Connection *newcrypto_connections = (Crypto_Connection *)realloc(c->crypto_connections, num * sizeof(Crypto_Connection)); - if (newcrypto_connections == NULL) { + if (newcrypto_connections == nullptr) { return -1; } @@ -1756,7 +1754,7 @@ static int create_crypto_connection(Net_Crypto *c) c->crypto_connections[id].packet_send_rate_requested = 0; c->crypto_connections[id].last_packets_left_requested_rem = 0; - if (pthread_mutex_init(&c->crypto_connections[id].mutex, NULL) != 0) { + if (pthread_mutex_init(&c->crypto_connections[id].mutex, nullptr) != 0) { pthread_mutex_unlock(&c->connections_mutex); return -1; } @@ -1831,7 +1829,7 @@ static int crypto_connection_add_source(Net_Crypto *c, int crypt_connection_id, { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -1850,7 +1848,7 @@ static int crypto_connection_add_source(Net_Crypto *c, int crypt_connection_id, } if (source.ip.family == TCP_FAMILY) { - if (add_tcp_number_relay_connection(c->tcp_c, conn->connection_number_tcp, source.ip.ip6.uint32[0]) == 0) { + if (add_tcp_number_relay_connection(c->tcp_c, conn->connection_number_tcp, source.ip.ip.v6.uint32[0]) == 0) { return 1; } } @@ -1884,7 +1882,7 @@ static int handle_new_connection_handshake(Net_Crypto *c, IP_Port source, const New_Connection n_c; n_c.cookie = (uint8_t *)malloc(COOKIE_LENGTH); - if (n_c.cookie == NULL) { + if (n_c.cookie == nullptr) { return -1; } @@ -1892,7 +1890,7 @@ static int handle_new_connection_handshake(Net_Crypto *c, IP_Port source, const n_c.cookie_length = COOKIE_LENGTH; if (handle_crypto_handshake(c, n_c.recv_nonce, n_c.peersessionpublic_key, n_c.public_key, n_c.dht_public_key, - n_c.cookie, data, length, 0) != 0) { + n_c.cookie, data, length, nullptr) != 0) { free(n_c.cookie); return -1; } @@ -2009,7 +2007,7 @@ int new_crypto_connection(Net_Crypto *c, const uint8_t *real_public_key, const u Crypto_Connection *conn = &c->crypto_connections[crypt_connection_id]; - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2059,7 +2057,7 @@ int set_direct_ip_port(Net_Crypto *c, int crypt_connection_id, IP_Port ip_port, { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2095,7 +2093,7 @@ static int tcp_data_callback(void *object, int id, const uint8_t *data, uint16_t Crypto_Connection *conn = get_crypto_connection(c, id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2134,7 +2132,7 @@ static int tcp_oob_callback(void *object, const uint8_t *public_key, unsigned in IP_Port source; source.port = 0; source.ip.family = TCP_FAMILY; - source.ip.ip6.uint32[0] = tcp_connections_number; + source.ip.ip.v6.uint32[0] = tcp_connections_number; if (handle_new_connection_handshake(c, source, data, length, userdata) != 0) { return -1; @@ -2155,7 +2153,7 @@ int add_tcp_relay_peer(Net_Crypto *c, int crypt_connection_id, IP_Port ip_port, { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2239,13 +2237,13 @@ static void do_tcp(Net_Crypto *c, void *userdata) for (i = 0; i < c->crypto_connections_length; ++i) { Crypto_Connection *conn = get_crypto_connection(c, i); - if (conn == 0) { + if (conn == nullptr) { return; } if (conn->status == CRYPTO_CONN_ESTABLISHED) { bool direct_connected = 0; - crypto_connection_status(c, i, &direct_connected, NULL); + crypto_connection_status(c, i, &direct_connected, nullptr); if (direct_connected) { pthread_mutex_lock(&c->tcp_mutex); @@ -2275,7 +2273,7 @@ int connection_status_handler(const Net_Crypto *c, int crypt_connection_id, { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2298,7 +2296,7 @@ int connection_data_handler(const Net_Crypto *c, int crypt_connection_id, int (* { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2322,7 +2320,7 @@ int connection_lossy_data_handler(Net_Crypto *c, int crypt_connection_id, { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2348,7 +2346,7 @@ int nc_dht_pk_callback(Net_Crypto *c, int crypt_connection_id, void (*function)( { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2405,7 +2403,7 @@ static int udp_handle_packet(void *object, IP_Port source, const uint8_t *packet Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2449,7 +2447,7 @@ static void send_crypto_packets(Net_Crypto *c) for (i = 0; i < c->crypto_connections_length; ++i) { Crypto_Connection *conn = get_crypto_connection(c, i); - if (conn == 0) { + if (conn == nullptr) { return; } @@ -2517,7 +2515,6 @@ static void send_crypto_packets(Net_Crypto *c) conn->last_sendqueue_size[pos] = num_packets_array(&conn->send_array); ++conn->last_sendqueue_counter; - unsigned int j; long signed int sum = 0; sum = (long signed int)conn->last_sendqueue_size[(pos) % CONGESTION_QUEUE_ARRAY_SIZE] - (long signed int)conn->last_sendqueue_size[(pos - (CONGESTION_QUEUE_ARRAY_SIZE - 1)) % CONGESTION_QUEUE_ARRAY_SIZE]; @@ -2527,7 +2524,7 @@ static void send_crypto_packets(Net_Crypto *c) conn->last_num_packets_resent[n_p_pos] = packets_resent; bool direct_connected = 0; - crypto_connection_status(c, i, &direct_connected, NULL); + crypto_connection_status(c, i, &direct_connected, nullptr); if (direct_connected && conn->last_tcp_sent + CONGESTION_EVENT_TIMEOUT > temp_time) { /* When switching from TCP to UDP, don't change the packet send rate for CONGESTION_EVENT_TIMEOUT ms. */ @@ -2542,7 +2539,7 @@ static void send_crypto_packets(Net_Crypto *c) delay = packets_set_rem_array; } - for (j = 0; j < CONGESTION_QUEUE_ARRAY_SIZE; ++j) { + for (unsigned j = 0; j < CONGESTION_QUEUE_ARRAY_SIZE; ++j) { unsigned int ind = (j + (packets_set_rem_array - delay) + n_p_pos) % CONGESTION_LAST_SENT_ARRAY_SIZE; total_sent += conn->last_num_packets_sent[ind]; total_resent += conn->last_num_packets_resent[ind]; @@ -2688,7 +2685,7 @@ uint32_t crypto_num_free_sendqueue_slots(const Net_Crypto *c, int crypt_connecti { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return 0; } @@ -2725,7 +2722,7 @@ int64_t write_cryptpacket(Net_Crypto *c, int crypt_connection_id, const uint8_t Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2763,7 +2760,7 @@ int cryptpacket_received(Net_Crypto *c, int crypt_connection_id, uint32_t packet { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return -1; } @@ -2872,7 +2869,7 @@ unsigned int crypto_connection_status(const Net_Crypto *c, int crypt_connection_ { Crypto_Connection *conn = get_crypto_connection(c, crypt_connection_id); - if (conn == 0) { + if (conn == nullptr) { return CRYPTO_CONN_NO_CONNECTION; } @@ -2929,33 +2926,33 @@ Net_Crypto *new_net_crypto(Logger *log, DHT *dht, TCP_Proxy_Info *proxy_info) { unix_time_update(); - if (dht == NULL) { - return NULL; + if (dht == nullptr) { + return nullptr; } Net_Crypto *temp = (Net_Crypto *)calloc(1, sizeof(Net_Crypto)); - if (temp == NULL) { - return NULL; + if (temp == nullptr) { + return nullptr; } temp->log = log; - temp->tcp_c = new_tcp_connections(dht->self_secret_key, proxy_info); + temp->tcp_c = new_tcp_connections(dht_get_self_secret_key(dht), proxy_info); - if (temp->tcp_c == NULL) { + if (temp->tcp_c == nullptr) { free(temp); - return NULL; + return nullptr; } set_packet_tcp_connection_callback(temp->tcp_c, &tcp_data_callback, temp); set_oob_packet_tcp_connection_callback(temp->tcp_c, &tcp_oob_callback, temp); if (create_recursive_mutex(&temp->tcp_mutex) != 0 || - pthread_mutex_init(&temp->connections_mutex, NULL) != 0) { + pthread_mutex_init(&temp->connections_mutex, nullptr) != 0) { kill_tcp_connections(temp->tcp_c); free(temp); - return NULL; + return nullptr; } temp->dht = dht; @@ -2965,10 +2962,10 @@ Net_Crypto *new_net_crypto(Logger *log, DHT *dht, TCP_Proxy_Info *proxy_info) temp->current_sleep_time = CRYPTO_SEND_PACKET_INTERVAL; - networking_registerhandler(dht->net, NET_PACKET_COOKIE_REQUEST, &udp_handle_cookie_request, temp); - networking_registerhandler(dht->net, NET_PACKET_COOKIE_RESPONSE, &udp_handle_packet, temp); - networking_registerhandler(dht->net, NET_PACKET_CRYPTO_HS, &udp_handle_packet, temp); - networking_registerhandler(dht->net, NET_PACKET_CRYPTO_DATA, &udp_handle_packet, temp); + networking_registerhandler(dht_get_net(dht), NET_PACKET_COOKIE_REQUEST, &udp_handle_cookie_request, temp); + networking_registerhandler(dht_get_net(dht), NET_PACKET_COOKIE_RESPONSE, &udp_handle_packet, temp); + networking_registerhandler(dht_get_net(dht), NET_PACKET_CRYPTO_HS, &udp_handle_packet, temp); + networking_registerhandler(dht_get_net(dht), NET_PACKET_CRYPTO_DATA, &udp_handle_packet, temp); bs_list_init(&temp->ip_port_list, sizeof(IP_Port), 8); @@ -2983,7 +2980,7 @@ static void kill_timedout(Net_Crypto *c, void *userdata) for (i = 0; i < c->crypto_connections_length; ++i) { Crypto_Connection *conn = get_crypto_connection(c, i); - if (conn == 0) { + if (conn == nullptr) { return; } @@ -3039,10 +3036,10 @@ void kill_net_crypto(Net_Crypto *c) kill_tcp_connections(c->tcp_c); bs_list_free(&c->ip_port_list); - networking_registerhandler(c->dht->net, NET_PACKET_COOKIE_REQUEST, NULL, NULL); - networking_registerhandler(c->dht->net, NET_PACKET_COOKIE_RESPONSE, NULL, NULL); - networking_registerhandler(c->dht->net, NET_PACKET_CRYPTO_HS, NULL, NULL); - networking_registerhandler(c->dht->net, NET_PACKET_CRYPTO_DATA, NULL, NULL); + networking_registerhandler(dht_get_net(c->dht), NET_PACKET_COOKIE_REQUEST, nullptr, nullptr); + networking_registerhandler(dht_get_net(c->dht), NET_PACKET_COOKIE_RESPONSE, nullptr, nullptr); + networking_registerhandler(dht_get_net(c->dht), NET_PACKET_CRYPTO_HS, nullptr, nullptr); + networking_registerhandler(dht_get_net(c->dht), NET_PACKET_CRYPTO_DATA, nullptr, nullptr); crypto_memzero(c, sizeof(Net_Crypto)); free(c); } diff --git a/protocols/Tox/libtox/src/toxcore/network.c b/protocols/Tox/libtox/src/toxcore/network.c index fb4748d4ec..e9c82c3930 100644 --- a/protocols/Tox/libtox/src/toxcore/network.c +++ b/protocols/Tox/libtox/src/toxcore/network.c @@ -25,10 +25,16 @@ #include "config.h" #endif +#ifdef __APPLE__ #define _DARWIN_C_SOURCE +#endif + +#ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 +#endif #if defined(_WIN32) && _WIN32_WINNT >= _WIN32_WINNT_WINXP +#undef _WIN32_WINNT #define _WIN32_WINNT 0x501 #endif @@ -46,7 +52,6 @@ #ifndef IPV6_ADD_MEMBERSHIP #ifdef IPV6_JOIN_GROUP #define IPV6_ADD_MEMBERSHIP IPV6_JOIN_GROUP -#define IPV6_DROP_MEMBERSHIP IPV6_LEAVE_GROUP #endif #endif @@ -79,8 +84,8 @@ static const char *inet_ntop(Family family, const void *addr, char *buf, size_t DWORD len = bufsize; - if (WSAAddressToString((LPSOCKADDR)&saddr, sizeof(saddr), NULL, buf, &len)) { - return NULL; + if (WSAAddressToString((LPSOCKADDR)&saddr, sizeof(saddr), nullptr, buf, &len)) { + return nullptr; } return buf; @@ -93,14 +98,14 @@ static const char *inet_ntop(Family family, const void *addr, char *buf, size_t DWORD len = bufsize; - if (WSAAddressToString((LPSOCKADDR)&saddr, sizeof(saddr), NULL, buf, &len)) { - return NULL; + if (WSAAddressToString((LPSOCKADDR)&saddr, sizeof(saddr), nullptr, buf, &len)) { + return nullptr; } return buf; } - return NULL; + return nullptr; } static int inet_pton(Family family, const char *addrString, void *addrbuf) @@ -111,7 +116,7 @@ static int inet_pton(Family family, const char *addrString, void *addrbuf) INT len = sizeof(saddr); - if (WSAStringToAddress((LPTSTR)addrString, AF_INET, NULL, (LPSOCKADDR)&saddr, &len)) { + if (WSAStringToAddress((LPTSTR)addrString, AF_INET, nullptr, (LPSOCKADDR)&saddr, &len)) { return 0; } @@ -124,7 +129,7 @@ static int inet_pton(Family family, const char *addrString, void *addrbuf) INT len = sizeof(saddr); - if (WSAStringToAddress((LPTSTR)addrString, AF_INET6, NULL, (LPSOCKADDR)&saddr, &len)) { + if (WSAStringToAddress((LPTSTR)addrString, AF_INET6, nullptr, (LPSOCKADDR)&saddr, &len)) { return 0; } @@ -182,14 +187,14 @@ const IP6 IP6_BROADCAST = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } }; -IP4 get_ip4_loopback() +IP4 get_ip4_loopback(void) { IP4 loopback; loopback.uint32 = htonl(INADDR_LOOPBACK); return loopback; } -IP6 get_ip6_loopback() +IP6 get_ip6_loopback(void) { IP6 loopback; get_ip6(&loopback, &in6addr_loopback); @@ -303,7 +308,7 @@ static uint64_t current_time_actual(void) return time / 10; #else struct timeval a; - gettimeofday(&a, NULL); + gettimeofday(&a, nullptr); time = 1000000ULL * a.tv_sec + a.tv_usec; return time; #endif @@ -371,18 +376,18 @@ static void loglogdata(Logger *log, const char *message, const uint8_t *buffer, char ip_str[IP_NTOA_LEN]; if (res < 0) { /* Windows doesn't necessarily know %zu */ - LOGGER_TRACE(log, "[%2u] %s %3hu%c %s:%hu (%u: %s) | %04x%04x", - buffer[0], message, (buflen < 999 ? (uint16_t)buflen : 999), 'E', + LOGGER_TRACE(log, "[%2u] %s %3u%c %s:%u (%u: %s) | %04x%04x", + buffer[0], message, (buflen < 999 ? buflen : 999), 'E', ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), errno, strerror(errno), data_0(buflen, buffer), data_1(buflen, buffer)); } else if ((res > 0) && ((size_t)res <= buflen)) { - LOGGER_TRACE(log, "[%2u] %s %3zu%c %s:%hu (%u: %s) | %04x%04x", - buffer[0], message, (res < 999 ? (size_t)res : 999), ((size_t)res < buflen ? '<' : '='), + LOGGER_TRACE(log, "[%2u] %s %3u%c %s:%u (%u: %s) | %04x%04x", + buffer[0], message, (res < 999 ? res : 999), ((size_t)res < buflen ? '<' : '='), ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), 0, "OK", data_0(buflen, buffer), data_1(buflen, buffer)); } else { /* empty or overwrite */ - LOGGER_TRACE(log, "[%2u] %s %zu%c%zu %s:%hu (%u: %s) | %04x%04x", - buffer[0], message, (size_t)res, (!res ? '!' : '>'), buflen, + LOGGER_TRACE(log, "[%2u] %s %u%c%u %s:%u (%u: %s) | %04x%04x", + buffer[0], message, res, (!res ? '!' : '>'), buflen, ip_ntoa(&ip_port.ip, ip_str, sizeof(ip_str)), net_ntohs(ip_port.port), 0, "OK", data_0(buflen, buffer), data_1(buflen, buffer)); } @@ -447,7 +452,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, const uint8_t *data, uint1 ip6.uint32[0] = 0; ip6.uint32[1] = 0; ip6.uint32[2] = net_htonl(0xFFFF); - ip6.uint32[3] = ip_port.ip.ip4.uint32; + ip6.uint32[3] = ip_port.ip.ip.v4.uint32; fill_addr6(ip6, &addr6->sin6_addr); addr6->sin6_flowinfo = 0; @@ -457,7 +462,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, const uint8_t *data, uint1 addrsize = sizeof(struct sockaddr_in); addr4->sin_family = AF_INET; - fill_addr4(ip_port.ip.ip4, &addr4->sin_addr); + fill_addr4(ip_port.ip.ip.v4, &addr4->sin_addr); addr4->sin_port = ip_port.port; } } else if (ip_port.ip.family == TOX_AF_INET6) { @@ -466,7 +471,7 @@ int sendpacket(Networking_Core *net, IP_Port ip_port, const uint8_t *data, uint1 addrsize = sizeof(struct sockaddr_in6); addr6->sin6_family = AF_INET6; addr6->sin6_port = ip_port.port; - fill_addr6(ip_port.ip.ip6, &addr6->sin6_addr); + fill_addr6(ip_port.ip.ip.v6, &addr6->sin6_addr); addr6->sin6_flowinfo = 0; addr6->sin6_scope_id = 0; @@ -514,17 +519,17 @@ static int receivepacket(Logger *log, Socket sock, IP_Port *ip_port, uint8_t *da struct sockaddr_in *addr_in = (struct sockaddr_in *)&addr; ip_port->ip.family = make_tox_family(addr_in->sin_family); - get_ip4(&ip_port->ip.ip4, &addr_in->sin_addr); + get_ip4(&ip_port->ip.ip.v4, &addr_in->sin_addr); ip_port->port = addr_in->sin_port; } else if (addr.ss_family == AF_INET6) { struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *)&addr; ip_port->ip.family = make_tox_family(addr_in6->sin6_family); - get_ip6(&ip_port->ip.ip6, &addr_in6->sin6_addr); + get_ip6(&ip_port->ip.ip.v6, &addr_in6->sin6_addr); ip_port->port = addr_in6->sin6_port; - if (IPV6_IPV4_IN_V6(ip_port->ip.ip6)) { + if (IPV6_IPV4_IN_V6(ip_port->ip.ip.v6)) { ip_port->ip.family = TOX_AF_INET; - ip_port->ip.ip4.uint32 = ip_port->ip.ip6.uint32[3]; + ip_port->ip.ip.v4.uint32 = ip_port->ip.ip.v6.uint32[3]; } } else { return -1; @@ -621,7 +626,7 @@ static void at_shutdown(void) */ Networking_Core *new_networking(Logger *log, IP ip, uint16_t port) { - return new_networking_ex(log, ip, port, port + (TOX_PORTRANGE_TO - TOX_PORTRANGE_FROM), 0); + return new_networking_ex(log, ip, port, port + (TOX_PORTRANGE_TO - TOX_PORTRANGE_FROM), nullptr); } /* Initialize networking. @@ -660,17 +665,17 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1 /* maybe check for invalid IPs like 224+.x.y.z? if there is any IP set ever */ if (ip.family != TOX_AF_INET && ip.family != TOX_AF_INET6) { LOGGER_ERROR(log, "Invalid address family: %u\n", ip.family); - return NULL; + return nullptr; } if (networking_at_startup() != 0) { - return NULL; + return nullptr; } Networking_Core *temp = (Networking_Core *)calloc(1, sizeof(Networking_Core)); - if (temp == NULL) { - return NULL; + if (temp == nullptr) { + return nullptr; } temp->log = log; @@ -690,7 +695,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1 *error = 1; } - return NULL; + return nullptr; } /* Functions to increase the size of the send and receive UDP buffers. @@ -711,7 +716,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1 *error = 1; } - return NULL; + return nullptr; } /* Set socket nonblocking. */ @@ -722,11 +727,11 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1 *error = 1; } - return NULL; + return nullptr; } /* Bind our socket to port PORT and the given IP address (usually 0.0.0.0 or ::) */ - uint16_t *portptr = NULL; + uint16_t *portptr = nullptr; struct sockaddr_storage addr; size_t addrsize; @@ -738,7 +743,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1 addrsize = sizeof(struct sockaddr_in); addr4->sin_family = AF_INET; addr4->sin_port = 0; - fill_addr4(ip.ip4, &addr4->sin_addr); + fill_addr4(ip.ip.v4, &addr4->sin_addr); portptr = &addr4->sin_port; } else if (temp->family == TOX_AF_INET6) { @@ -747,7 +752,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1 addrsize = sizeof(struct sockaddr_in6); addr6->sin6_family = AF_INET6; addr6->sin6_port = 0; - fill_addr6(ip.ip6, &addr6->sin6_addr); + fill_addr6(ip.ip.v6, &addr6->sin6_addr); addr6->sin6_flowinfo = 0; addr6->sin6_scope_id = 0; @@ -755,7 +760,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1 portptr = &addr6->sin6_port; } else { free(temp); - return NULL; + return nullptr; } if (ip.family == TOX_AF_INET6) { @@ -838,7 +843,7 @@ Networking_Core *new_networking_ex(Logger *log, IP ip, uint16_t port_from, uint1 *error = 1; } - return NULL; + return nullptr; } Networking_Core *new_networking_no_udp(Logger *log) @@ -846,8 +851,8 @@ Networking_Core *new_networking_no_udp(Logger *log) /* this is the easiest way to completely disable UDP without changing too much code. */ Networking_Core *net = (Networking_Core *)calloc(1, sizeof(Networking_Core)); - if (net == NULL) { - return NULL; + if (net == nullptr) { + return nullptr; } net->log = log; @@ -887,14 +892,14 @@ int ip_equal(const IP *a, const IP *b) if (a->family == TOX_AF_INET || a->family == TCP_INET) { struct in_addr addr_a; struct in_addr addr_b; - fill_addr4(a->ip4, &addr_a); - fill_addr4(b->ip4, &addr_b); + fill_addr4(a->ip.v4, &addr_a); + fill_addr4(b->ip.v4, &addr_b); return addr_a.s_addr == addr_b.s_addr; } if (a->family == TOX_AF_INET6 || a->family == TCP_INET6) { - return a->ip6.uint64[0] == b->ip6.uint64[0] && - a->ip6.uint64[1] == b->ip6.uint64[1]; + return a->ip.v6.uint64[0] == b->ip.v6.uint64[0] && + a->ip.v6.uint64[1] == b->ip.v6.uint64[1]; } return 0; @@ -902,16 +907,16 @@ int ip_equal(const IP *a, const IP *b) /* different family: check on the IPv6 one if it is the IPv4 one embedded */ if ((a->family == TOX_AF_INET) && (b->family == TOX_AF_INET6)) { - if (IPV6_IPV4_IN_V6(b->ip6)) { + if (IPV6_IPV4_IN_V6(b->ip.v6)) { struct in_addr addr_a; - fill_addr4(a->ip4, &addr_a); - return addr_a.s_addr == b->ip6.uint32[3]; + fill_addr4(a->ip.v4, &addr_a); + return addr_a.s_addr == b->ip.v6.uint32[3]; } } else if ((a->family == TOX_AF_INET6) && (b->family == TOX_AF_INET)) { - if (IPV6_IPV4_IN_V6(a->ip6)) { + if (IPV6_IPV4_IN_V6(a->ip.v6)) { struct in_addr addr_b; - fill_addr4(b->ip4, &addr_b); - return a->ip6.uint32[3] == addr_b.s_addr; + fill_addr4(b->ip.v4, &addr_b); + return a->ip.v6.uint32[3] == addr_b.s_addr; } } @@ -948,7 +953,7 @@ void ip_reset(IP *ip) } /* nulls out ip, sets family according to flag */ -void ip_init(IP *ip, uint8_t ipv6enabled) +void ip_init(IP *ip, bool ipv6enabled) { if (!ip) { return; @@ -1024,14 +1029,14 @@ const char *ip_ntoa(const IP *ip, char *ip_str, size_t length) if (ip->family == TOX_AF_INET) { /* returns standard quad-dotted notation */ struct in_addr addr; - fill_addr4(ip->ip4, &addr); + fill_addr4(ip->ip.v4, &addr); ip_str[0] = 0; inet_ntop(family, &addr, ip_str, length); } else if (ip->family == TOX_AF_INET6) { /* returns hex-groups enclosed into square brackets */ struct in6_addr addr; - fill_addr6(ip->ip6, &addr); + fill_addr6(ip->ip.v6, &addr); ip_str[0] = '['; inet_ntop(family, &addr, &ip_str[1], length - 3); @@ -1072,13 +1077,13 @@ int ip_parse_addr(const IP *ip, char *address, size_t length) } if (ip->family == TOX_AF_INET) { - const struct in_addr *addr = (const struct in_addr *)&ip->ip4; - return inet_ntop(ip->family, addr, address, length) != NULL; + const struct in_addr *addr = (const struct in_addr *)&ip->ip.v4; + return inet_ntop(ip->family, addr, address, length) != nullptr; } if (ip->family == TOX_AF_INET6) { - const struct in6_addr *addr = (const struct in6_addr *)&ip->ip6; - return inet_ntop(ip->family, addr, address, length) != NULL; + const struct in6_addr *addr = (const struct in6_addr *)&ip->ip.v6; + return inet_ntop(ip->family, addr, address, length) != nullptr; } return 0; @@ -1107,7 +1112,7 @@ int addr_parse_ip(const char *address, IP *to) if (inet_pton(AF_INET, address, &addr4) == 1) { to->family = TOX_AF_INET; - get_ip4(&to->ip4, &addr4); + get_ip4(&to->ip.v4, &addr4); return 1; } @@ -1115,7 +1120,7 @@ int addr_parse_ip(const char *address, IP *to) if (inet_pton(AF_INET6, address, &addr6) == 1) { to->family = TOX_AF_INET6; - get_ip6(&to->ip6, &addr6); + get_ip6(&to->ip.v6, &addr6); return 1; } @@ -1148,8 +1153,8 @@ int addr_resolve(const char *address, IP *to, IP *extra) Family tox_family = to->family; Family family = make_family(tox_family); - struct addrinfo *server = NULL; - struct addrinfo *walker = NULL; + struct addrinfo *server = nullptr; + struct addrinfo *walker = nullptr; struct addrinfo hints; int rc; int result = 0; @@ -1163,7 +1168,7 @@ int addr_resolve(const char *address, IP *to, IP *extra) return 0; } - rc = getaddrinfo(address, NULL, &hints, &server); + rc = getaddrinfo(address, nullptr, &hints, &server); // Lookup failed. if (rc != 0) { @@ -1175,17 +1180,17 @@ int addr_resolve(const char *address, IP *to, IP *extra) IP ip6; ip_init(&ip6, 1); // ipv6enabled = 1 - for (walker = server; (walker != NULL) && !done; walker = walker->ai_next) { + for (walker = server; (walker != nullptr) && !done; walker = walker->ai_next) { switch (walker->ai_family) { case AF_INET: if (walker->ai_family == family) { /* AF_INET requested, done */ struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr; - get_ip4(&to->ip4, &addr->sin_addr); + get_ip4(&to->ip.v4, &addr->sin_addr); result = TOX_ADDR_RESOLVE_INET; done = 1; } else if (!(result & TOX_ADDR_RESOLVE_INET)) { /* AF_UNSPEC requested, store away */ struct sockaddr_in *addr = (struct sockaddr_in *)walker->ai_addr; - get_ip4(&ip4.ip4, &addr->sin_addr); + get_ip4(&ip4.ip.v4, &addr->sin_addr); result |= TOX_ADDR_RESOLVE_INET; } @@ -1195,14 +1200,14 @@ int addr_resolve(const char *address, IP *to, IP *extra) if (walker->ai_family == family) { /* AF_INET6 requested, done */ if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) { struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr; - get_ip6(&to->ip6, &addr->sin6_addr); + get_ip6(&to->ip.v6, &addr->sin6_addr); result = TOX_ADDR_RESOLVE_INET6; done = 1; } } else if (!(result & TOX_ADDR_RESOLVE_INET6)) { /* AF_UNSPEC requested, store away */ if (walker->ai_addrlen == sizeof(struct sockaddr_in6)) { struct sockaddr_in6 *addr = (struct sockaddr_in6 *)walker->ai_addr; - get_ip6(&ip6.ip6, &addr->sin6_addr); + get_ip6(&ip6.ip.v6, &addr->sin6_addr); result |= TOX_ADDR_RESOLVE_INET6; } } @@ -1215,7 +1220,7 @@ int addr_resolve(const char *address, IP *to, IP *extra) if (result & TOX_ADDR_RESOLVE_INET6) { ip_copy(to, &ip6); - if ((result & TOX_ADDR_RESOLVE_INET) && (extra != NULL)) { + if ((result & TOX_ADDR_RESOLVE_INET) && (extra != nullptr)) { ip_copy(extra, &ip4); } } else if (result & TOX_ADDR_RESOLVE_INET) { @@ -1265,14 +1270,14 @@ int net_connect(Socket sock, IP_Port ip_port) addrsize = sizeof(struct sockaddr_in); addr4->sin_family = AF_INET; - fill_addr4(ip_port.ip.ip4, &addr4->sin_addr); + fill_addr4(ip_port.ip.ip.v4, &addr4->sin_addr); addr4->sin_port = ip_port.port; } else if (ip_port.ip.family == TOX_AF_INET6) { struct sockaddr_in6 *addr6 = (struct sockaddr_in6 *)&addr; addrsize = sizeof(struct sockaddr_in6); addr6->sin6_family = AF_INET6; - fill_addr6(ip_port.ip.ip6, &addr6->sin6_addr); + fill_addr6(ip_port.ip.ip.v6, &addr6->sin6_addr); addr6->sin6_port = ip_port.port; } else { return 0; @@ -1284,8 +1289,8 @@ int net_connect(Socket sock, IP_Port ip_port) int32_t net_getipport(const char *node, IP_Port **res, int tox_type) { struct addrinfo *infos; - int ret = getaddrinfo(node, NULL, NULL, &infos); - *res = NULL; + int ret = getaddrinfo(node, nullptr, nullptr, &infos); + *res = nullptr; if (ret != 0) { return -1; @@ -1295,9 +1300,9 @@ int32_t net_getipport(const char *node, IP_Port **res, int tox_type) const size_t MAX_COUNT = MIN(SIZE_MAX, INT32_MAX) / sizeof(IP_Port); int type = make_socktype(tox_type); struct addrinfo *cur; - int32_t count = 0; + size_t count = 0; - for (cur = infos; count < MAX_COUNT && cur != NULL; cur = cur->ai_next) { + for (cur = infos; count < MAX_COUNT && cur != nullptr; cur = cur->ai_next) { if (cur->ai_socktype && type > 0 && cur->ai_socktype != type) { continue; } @@ -1318,24 +1323,24 @@ int32_t net_getipport(const char *node, IP_Port **res, int tox_type) *res = (IP_Port *)malloc(sizeof(IP_Port) * count); - if (*res == NULL) { + if (*res == nullptr) { freeaddrinfo(infos); return -1; } IP_Port *ip_port = *res; - for (cur = infos; cur != NULL; cur = cur->ai_next) { + for (cur = infos; cur != nullptr; cur = cur->ai_next) { if (cur->ai_socktype && type > 0 && cur->ai_socktype != type) { continue; } if (cur->ai_family == AF_INET) { struct sockaddr_in *addr = (struct sockaddr_in *)cur->ai_addr; - memcpy(&ip_port->ip.ip4, &addr->sin_addr, sizeof(IP4)); + memcpy(&ip_port->ip.ip.v4, &addr->sin_addr, sizeof(IP4)); } else if (cur->ai_family == AF_INET6) { struct sockaddr_in6 *addr = (struct sockaddr_in6 *)cur->ai_addr; - memcpy(&ip_port->ip.ip6, &addr->sin6_addr, sizeof(IP6)); + memcpy(&ip_port->ip.ip.v6, &addr->sin6_addr, sizeof(IP6)); } else { continue; } @@ -1471,3 +1476,54 @@ uint16_t net_ntohs(uint16_t hostshort) { return ntohs(hostshort); } + +size_t net_pack_u16(uint8_t *bytes, uint16_t v) +{ + bytes[0] = (v >> 8) & 0xff; + bytes[1] = v & 0xff; + return sizeof(v); +} + +size_t net_pack_u32(uint8_t *bytes, uint32_t v) +{ + uint8_t *p = bytes; + p += net_pack_u16(p, (v >> 16) & 0xffff); + p += net_pack_u16(p, v & 0xffff); + return p - bytes; +} + +size_t net_pack_u64(uint8_t *bytes, uint64_t v) +{ + uint8_t *p = bytes; + p += net_pack_u32(p, (v >> 32) & 0xffffffff); + p += net_pack_u32(p, v & 0xffffffff); + return p - bytes; +} + +size_t net_unpack_u16(const uint8_t *bytes, uint16_t *v) +{ + uint8_t hi = bytes[0]; + uint8_t lo = bytes[1]; + *v = ((uint16_t)hi << 8) | lo; + return sizeof(*v); +} + +size_t net_unpack_u32(const uint8_t *bytes, uint32_t *v) +{ + const uint8_t *p = bytes; + uint16_t lo, hi; + p += net_unpack_u16(p, &hi); + p += net_unpack_u16(p, &lo); + *v = ((uint32_t)hi << 16) | lo; + return p - bytes; +} + +size_t net_unpack_u64(const uint8_t *bytes, uint64_t *v) +{ + const uint8_t *p = bytes; + uint32_t lo, hi; + p += net_unpack_u32(p, &hi); + p += net_unpack_u32(p, &lo); + *v = ((uint64_t)hi << 32) | lo; + return p - bytes; +} diff --git a/protocols/Tox/libtox/src/toxcore/network.h b/protocols/Tox/libtox/src/toxcore/network.h index d3b80218b0..405721b290 100644 --- a/protocols/Tox/libtox/src/toxcore/network.h +++ b/protocols/Tox/libtox/src/toxcore/network.h @@ -33,6 +33,7 @@ #include "ccompat.h" #include "logger.h" +#include <stdbool.h> #include <stdint.h> #include <stdio.h> #include <stdlib.h> @@ -63,6 +64,10 @@ #endif +#ifdef __cplusplus +extern "C" { +#endif + typedef short Family; typedef int Socket; @@ -125,17 +130,16 @@ typedef enum NET_PACKET_TYPE { #define TCP_INET6 (TOX_AF_INET6 + 3) #define TCP_FAMILY (TOX_AF_INET6 + 4) -typedef union { +typedef union IP4 { uint32_t uint32; uint16_t uint16[2]; uint8_t uint8[4]; -} -IP4; +} IP4; IP4 get_ip4_loopback(void); extern const IP4 IP4_BROADCAST; -typedef union { +typedef union IP6 { uint8_t uint8[16]; uint16_t uint16[8]; uint32_t uint32[4]; @@ -146,12 +150,12 @@ IP6 get_ip6_loopback(void); extern const IP6 IP6_BROADCAST; #define IP_DEFINED -typedef struct { +typedef struct IP { uint8_t family; - GNU_EXTENSION union { - IP4 ip4; - IP6 ip6; - }; + union { + IP4 v4; + IP6 v6; + } ip; } IP; #define IP_PORT_DEFINED @@ -167,6 +171,14 @@ uint16_t net_htons(uint16_t hostshort); uint32_t net_ntohl(uint32_t hostlong); uint16_t net_ntohs(uint16_t hostshort); +size_t net_pack_u16(uint8_t *bytes, uint16_t v); +size_t net_pack_u32(uint8_t *bytes, uint32_t v); +size_t net_pack_u64(uint8_t *bytes, uint64_t v); + +size_t net_unpack_u16(const uint8_t *bytes, uint16_t *v); +size_t net_unpack_u32(const uint8_t *bytes, uint32_t *v); +size_t net_unpack_u64(const uint8_t *bytes, uint64_t *v); + /* Does the IP6 struct a contain an IPv4 address in an IPv6 one? */ #define IPV6_IPV4_IN_V6(a) ((a.uint64[0] == 0) && (a.uint32[2] == net_htonl (0xffff))) @@ -176,7 +188,7 @@ uint16_t net_ntohs(uint16_t hostshort); #define SIZE_PORT 2 #define SIZE_IPPORT (SIZE_IP + SIZE_PORT) -#define TOX_ENABLE_IPV6_DEFAULT 1 +#define TOX_ENABLE_IPV6_DEFAULT true /* addr_resolve return values */ #define TOX_ADDR_RESOLVE_INET 1 @@ -249,7 +261,7 @@ int ipport_equal(const IP_Port *a, const IP_Port *b); /* nulls out ip */ void ip_reset(IP *ip); /* nulls out ip, sets family according to flag */ -void ip_init(IP *ip, uint8_t ipv6enabled); +void ip_init(IP *ip, bool ipv6enabled); /* checks if ip is valid */ int ip_isset(const IP *ip); /* checks if ip is valid */ @@ -409,4 +421,8 @@ Networking_Core *new_networking_no_udp(Logger *log); /* Function to cleanup networking stuff (doesn't do much right now). */ void kill_networking(Networking_Core *net); +#ifdef __cplusplus +} // extern "C" +#endif + #endif diff --git a/protocols/Tox/libtox/src/toxcore/onion.c b/protocols/Tox/libtox/src/toxcore/onion.c index fbaf7205d9..48cc4d768c 100644 --- a/protocols/Tox/libtox/src/toxcore/onion.c +++ b/protocols/Tox/libtox/src/toxcore/onion.c @@ -55,9 +55,9 @@ static void ip_pack(uint8_t *data, IP source) if (source.family == TOX_AF_INET || source.family == TOX_TCP_INET) { memset(data + 1, 0, SIZE_IP6); - memcpy(data + 1, source.ip4.uint8, SIZE_IP4); + memcpy(data + 1, source.ip.v4.uint8, SIZE_IP4); } else { - memcpy(data + 1, source.ip6.uint8, SIZE_IP6); + memcpy(data + 1, source.ip.v6.uint8, SIZE_IP6); } } @@ -71,9 +71,9 @@ static int ip_unpack(IP *target, const uint8_t *data, unsigned int data_size, bo target->family = data[0]; if (target->family == TOX_AF_INET || target->family == TOX_TCP_INET) { - memcpy(target->ip4.uint8, data + 1, SIZE_IP4); + memcpy(target->ip.v4.uint8, data + 1, SIZE_IP4); } else { - memcpy(target->ip6.uint8, data + 1, SIZE_IP6); + memcpy(target->ip.v6.uint8, data + 1, SIZE_IP6); } bool valid = disable_family_check || @@ -120,8 +120,8 @@ int create_onion_path(const DHT *dht, Onion_Path *new_path, const Node_format *n return -1; } - encrypt_precompute(nodes[0].public_key, dht->self_secret_key, new_path->shared_key1); - memcpy(new_path->public_key1, dht->self_public_key, CRYPTO_PUBLIC_KEY_SIZE); + encrypt_precompute(nodes[0].public_key, dht_get_self_secret_key(dht), new_path->shared_key1); + memcpy(new_path->public_key1, dht_get_self_public_key(dht), CRYPTO_PUBLIC_KEY_SIZE); uint8_t random_public_key[CRYPTO_PUBLIC_KEY_SIZE]; uint8_t random_secret_key[CRYPTO_SECRET_KEY_SIZE]; @@ -338,7 +338,7 @@ static int handle_send_initial(void *object, IP_Port source, const uint8_t *pack uint8_t plain[ONION_MAX_PACKET_SIZE]; uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE]; - get_shared_key(&onion->shared_keys_1, shared_key, onion->dht->self_secret_key, packet + 1 + CRYPTO_NONCE_SIZE); + get_shared_key(&onion->shared_keys_1, shared_key, dht_get_self_secret_key(onion->dht), packet + 1 + CRYPTO_NONCE_SIZE); int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE, length - (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE), plain); @@ -407,7 +407,7 @@ static int handle_send_1(void *object, IP_Port source, const uint8_t *packet, ui uint8_t plain[ONION_MAX_PACKET_SIZE]; uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE]; - get_shared_key(&onion->shared_keys_2, shared_key, onion->dht->self_secret_key, packet + 1 + CRYPTO_NONCE_SIZE); + get_shared_key(&onion->shared_keys_2, shared_key, dht_get_self_secret_key(onion->dht), packet + 1 + CRYPTO_NONCE_SIZE); int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE, length - (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE + RETURN_1), plain); @@ -463,7 +463,7 @@ static int handle_send_2(void *object, IP_Port source, const uint8_t *packet, ui uint8_t plain[ONION_MAX_PACKET_SIZE]; uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE]; - get_shared_key(&onion->shared_keys_3, shared_key, onion->dht->self_secret_key, packet + 1 + CRYPTO_NONCE_SIZE); + get_shared_key(&onion->shared_keys_3, shared_key, dht_get_self_secret_key(onion->dht), packet + 1 + CRYPTO_NONCE_SIZE); int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE, length - (1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE + RETURN_2), plain); @@ -635,18 +635,18 @@ void set_callback_handle_recv_1(Onion *onion, int (*function)(void *, IP_Port, c Onion *new_onion(DHT *dht) { - if (dht == NULL) { - return NULL; + if (dht == nullptr) { + return nullptr; } Onion *onion = (Onion *)calloc(1, sizeof(Onion)); - if (onion == NULL) { - return NULL; + if (onion == nullptr) { + return nullptr; } onion->dht = dht; - onion->net = dht->net; + onion->net = dht_get_net(dht); new_symmetric_key(onion->secret_symmetric_key); onion->timestamp = unix_time(); @@ -663,17 +663,17 @@ Onion *new_onion(DHT *dht) void kill_onion(Onion *onion) { - if (onion == NULL) { + if (onion == nullptr) { return; } - networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_INITIAL, NULL, NULL); - networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_1, NULL, NULL); - networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_2, NULL, NULL); + networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_INITIAL, nullptr, nullptr); + networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_1, nullptr, nullptr); + networking_registerhandler(onion->net, NET_PACKET_ONION_SEND_2, nullptr, nullptr); - networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_3, NULL, NULL); - networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_2, NULL, NULL); - networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_1, NULL, NULL); + networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_3, nullptr, nullptr); + networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_2, nullptr, nullptr); + networking_registerhandler(onion->net, NET_PACKET_ONION_RECV_1, nullptr, nullptr); free(onion); } diff --git a/protocols/Tox/libtox/src/toxcore/onion_announce.c b/protocols/Tox/libtox/src/toxcore/onion_announce.c index ab96a546fb..8e49f7bdc7 100644 --- a/protocols/Tox/libtox/src/toxcore/onion_announce.c +++ b/protocols/Tox/libtox/src/toxcore/onion_announce.c @@ -87,7 +87,7 @@ int create_announce_request(uint8_t *packet, uint16_t max_packet_length, const u } uint8_t plain[ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE + - ONION_ANNOUNCE_SENDBACK_DATA_LENGTH]; + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH]; memcpy(plain, ping_id, ONION_PING_ID_SIZE); memcpy(plain + ONION_PING_ID_SIZE, client_id, CRYPTO_PUBLIC_KEY_SIZE); memcpy(plain + ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE, data_public_key, CRYPTO_PUBLIC_KEY_SIZE); @@ -332,10 +332,8 @@ static int add_to_entries(Onion_Announce *onion_a, IP_Port ret_ip_port, const ui int pos = in_entries(onion_a, public_key); - unsigned int i; - if (pos == -1) { - for (i = 0; i < ONION_ANNOUNCE_MAX_ENTRIES; ++i) { + for (unsigned i = 0; i < ONION_ANNOUNCE_MAX_ENTRIES; ++i) { if (is_timeout(onion_a->entries[i].time, ONION_ANNOUNCE_TIMEOUT)) { pos = i; } @@ -343,7 +341,7 @@ static int add_to_entries(Onion_Announce *onion_a, IP_Port ret_ip_port, const ui } if (pos == -1) { - if (id_closest(onion_a->dht->self_public_key, public_key, onion_a->entries[0].public_key) == 1) { + if (id_closest(dht_get_self_public_key(onion_a->dht), public_key, onion_a->entries[0].public_key) == 1) { pos = 0; } } @@ -358,7 +356,7 @@ static int add_to_entries(Onion_Announce *onion_a, IP_Port ret_ip_port, const ui memcpy(onion_a->entries[pos].data_public_key, data_public_key, CRYPTO_PUBLIC_KEY_SIZE); onion_a->entries[pos].time = unix_time(); - sort_onion_announce_list(onion_a->entries, ONION_ANNOUNCE_MAX_ENTRIES, onion_a->dht->self_public_key); + sort_onion_announce_list(onion_a->entries, ONION_ANNOUNCE_MAX_ENTRIES, dht_get_self_public_key(onion_a->dht)); return in_entries(onion_a, public_key); } @@ -372,10 +370,10 @@ static int handle_announce_request(void *object, IP_Port source, const uint8_t * const uint8_t *packet_public_key = packet + 1 + CRYPTO_NONCE_SIZE; uint8_t shared_key[CRYPTO_SHARED_KEY_SIZE]; - get_shared_key(&onion_a->shared_keys_recv, shared_key, onion_a->dht->self_secret_key, packet_public_key); + get_shared_key(&onion_a->shared_keys_recv, shared_key, dht_get_self_secret_key(onion_a->dht), packet_public_key); uint8_t plain[ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE + - ONION_ANNOUNCE_SENDBACK_DATA_LENGTH]; + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH]; int len = decrypt_data_symmetric(shared_key, packet + 1, packet + 1 + CRYPTO_NONCE_SIZE + CRYPTO_PUBLIC_KEY_SIZE, ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE + CRYPTO_PUBLIC_KEY_SIZE + ONION_ANNOUNCE_SENDBACK_DATA_LENGTH + CRYPTO_MAC_SIZE, plain); @@ -390,7 +388,7 @@ static int handle_announce_request(void *object, IP_Port source, const uint8_t * uint8_t ping_id2[ONION_PING_ID_SIZE]; generate_ping_id(onion_a, unix_time() + PING_ID_TIMEOUT, packet_public_key, source, ping_id2); - int index = -1; + int index; uint8_t *data_public_key = plain + ONION_PING_ID_SIZE + CRYPTO_PUBLIC_KEY_SIZE; @@ -493,18 +491,18 @@ static int handle_data_request(void *object, IP_Port source, const uint8_t *pack Onion_Announce *new_onion_announce(DHT *dht) { - if (dht == NULL) { - return NULL; + if (dht == nullptr) { + return nullptr; } Onion_Announce *onion_a = (Onion_Announce *)calloc(1, sizeof(Onion_Announce)); - if (onion_a == NULL) { - return NULL; + if (onion_a == nullptr) { + return nullptr; } onion_a->dht = dht; - onion_a->net = dht->net; + onion_a->net = dht_get_net(dht); new_symmetric_key(onion_a->secret_bytes); networking_registerhandler(onion_a->net, NET_PACKET_ANNOUNCE_REQUEST, &handle_announce_request, onion_a); @@ -515,11 +513,11 @@ Onion_Announce *new_onion_announce(DHT *dht) void kill_onion_announce(Onion_Announce *onion_a) { - if (onion_a == NULL) { + if (onion_a == nullptr) { return; } - networking_registerhandler(onion_a->net, NET_PACKET_ANNOUNCE_REQUEST, NULL, NULL); - networking_registerhandler(onion_a->net, NET_PACKET_ONION_DATA_REQUEST, NULL, NULL); + networking_registerhandler(onion_a->net, NET_PACKET_ANNOUNCE_REQUEST, nullptr, nullptr); + networking_registerhandler(onion_a->net, NET_PACKET_ONION_DATA_REQUEST, nullptr, nullptr); free(onion_a); } diff --git a/protocols/Tox/libtox/src/toxcore/onion_client.c b/protocols/Tox/libtox/src/toxcore/onion_client.c index f7ff41bd7a..c4eb3fc175 100644 --- a/protocols/Tox/libtox/src/toxcore/onion_client.c +++ b/protocols/Tox/libtox/src/toxcore/onion_client.c @@ -280,7 +280,7 @@ static uint16_t random_nodes_path_onion(const Onion_Client *onion_c, Node_format if (num_nodes >= 2) { nodes[0].ip_port.ip.family = TCP_FAMILY; - nodes[0].ip_port.ip.ip4.uint32 = random_tcp; + nodes[0].ip_port.ip.ip.v4.uint32 = random_tcp; for (i = 1; i < max_num; ++i) { nodes[i] = onion_c->path_nodes[rand() % num_nodes]; @@ -294,7 +294,7 @@ static uint16_t random_nodes_path_onion(const Onion_Client *onion_c, Node_format } nodes[0].ip_port.ip.family = TCP_FAMILY; - nodes[0].ip_port.ip.ip4.uint32 = random_tcp; + nodes[0].ip_port.ip.ip.v4.uint32 = random_tcp; for (i = 1; i < max_num; ++i) { nodes[i] = onion_c->path_nodes_bs[rand() % num_nodes_bs]; @@ -485,7 +485,7 @@ static int send_onion_packet_tcp_udp(const Onion_Client *onion_c, const Onion_Pa return -1; } - return send_tcp_onion_request(onion_c->c, path->ip_port1.ip.ip4.uint32, packet, len); + return send_tcp_onion_request(onion_c->c, path->ip_port1.ip.ip.v4.uint32, packet, len); } return -1; @@ -579,7 +579,7 @@ static int client_send_announce_request(Onion_Client *onion_c, uint32_t num, IP_ uint8_t zero_ping_id[ONION_PING_ID_SIZE] = {0}; - if (ping_id == NULL) { + if (ping_id == nullptr) { ping_id = zero_ping_id; } @@ -670,8 +670,8 @@ static int client_add_to_list(Onion_Client *onion_c, uint32_t num, const uint8_t return -1; } - Onion_Node *list_nodes = NULL; - const uint8_t *reference_id = NULL; + Onion_Node *list_nodes = nullptr; + const uint8_t *reference_id = nullptr; unsigned int list_length; if (num == 0) { @@ -772,12 +772,12 @@ static int client_ping_nodes(Onion_Client *onion_c, uint32_t num, const Node_for return 0; } - Onion_Node *list_nodes = NULL; - const uint8_t *reference_id = NULL; + Onion_Node *list_nodes = nullptr; + const uint8_t *reference_id = nullptr; unsigned int list_length; - Last_Pinged *last_pinged = NULL; - uint8_t *last_pinged_index = NULL; + Last_Pinged *last_pinged = nullptr; + uint8_t *last_pinged_index = nullptr; if (num == 0) { list_nodes = onion_c->clients_announce_list; @@ -816,7 +816,7 @@ static int client_ping_nodes(Onion_Client *onion_c, uint32_t num, const Node_for } if (j == list_length && good_to_ping(last_pinged, last_pinged_index, nodes[i].public_key)) { - client_send_announce_request(onion_c, num, nodes[i].ip_port, nodes[i].public_key, NULL, ~0); + client_send_announce_request(onion_c, num, nodes[i].ip_port, nodes[i].public_key, nullptr, ~0); } } } @@ -845,7 +845,7 @@ static int handle_announce_response(void *object, IP_Port source, const uint8_t } VLA(uint8_t, plain, 1 + ONION_PING_ID_SIZE + len_nodes); - int len = -1; + int len; if (num == 0) { len = decrypt_data(public_key, nc_get_self_secret_key(onion_c->c), @@ -875,7 +875,7 @@ static int handle_announce_response(void *object, IP_Port source, const uint8_t if (len_nodes != 0) { Node_format nodes[MAX_SENT_NODES]; - int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, 0, plain + 1 + ONION_PING_ID_SIZE, len_nodes, 0); + int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, nullptr, plain + 1 + ONION_PING_ID_SIZE, len_nodes, 0); if (num_nodes <= 0) { return 1; @@ -974,7 +974,7 @@ static int handle_dhtpk_announce(void *object, const uint8_t *source_pubkey, con if (len_nodes != 0) { Node_format nodes[MAX_SENT_NODES]; - int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, 0, data + 1 + sizeof(uint64_t) + CRYPTO_PUBLIC_KEY_SIZE, + int num_nodes = unpack_nodes(nodes, MAX_SENT_NODES, nullptr, data + 1 + sizeof(uint64_t) + CRYPTO_PUBLIC_KEY_SIZE, len_nodes, 1); if (num_nodes <= 0) { @@ -1133,7 +1133,7 @@ static int send_dht_dhtpk(const Onion_Client *onion_c, int friend_num, const uin } uint8_t packet[MAX_CRYPTO_REQUEST_SIZE]; - len = create_request(onion_c->dht->self_public_key, onion_c->dht->self_secret_key, packet, + len = create_request(dht_get_self_public_key(onion_c->dht), dht_get_self_secret_key(onion_c->dht), packet, onion_c->friends_list[friend_num].dht_public_key, temp, SIZEOF_VLA(temp), CRYPTO_PACKET_DHTPK); if (len == -1) { @@ -1192,7 +1192,7 @@ static int send_dhtpk_announce(Onion_Client *onion_c, uint16_t friend_num, uint8 uint64_t no_replay = unix_time(); host_to_net((uint8_t *)&no_replay, sizeof(no_replay)); memcpy(data + 1, &no_replay, sizeof(no_replay)); - memcpy(data + 1 + sizeof(uint64_t), onion_c->dht->self_public_key, CRYPTO_PUBLIC_KEY_SIZE); + memcpy(data + 1 + sizeof(uint64_t), dht_get_self_public_key(onion_c->dht), CRYPTO_PUBLIC_KEY_SIZE); Node_format nodes[MAX_SENT_NODES]; uint16_t num_relays = copy_connected_tcp_relays(onion_c->c, nodes, (MAX_SENT_NODES / 2)); uint16_t num_nodes = closelist_nodes(onion_c->dht, &nodes[num_relays], MAX_SENT_NODES - num_relays); @@ -1260,13 +1260,13 @@ static int realloc_onion_friends(Onion_Client *onion_c, uint32_t num) { if (num == 0) { free(onion_c->friends_list); - onion_c->friends_list = NULL; + onion_c->friends_list = nullptr; return 0; } Onion_Friend *newonion_friends = (Onion_Friend *)realloc(onion_c->friends_list, num * sizeof(Onion_Friend)); - if (newonion_friends == NULL) { + if (newonion_friends == nullptr) { return -1; } @@ -1351,14 +1351,14 @@ int onion_delfriend(Onion_Client *onion_c, int friend_num) * return -1 on failure. * return 0 on success. */ -int recv_tcp_relay_handler(Onion_Client *onion_c, int friend_num, int (*tcp_relay_node_callback)(void *object, +int recv_tcp_relay_handler(Onion_Client *onion_c, int friend_num, int (*callback)(void *object, uint32_t number, IP_Port ip_port, const uint8_t *public_key), void *object, uint32_t number) { if ((uint32_t)friend_num >= onion_c->num_friends) { return -1; } - onion_c->friends_list[friend_num].tcp_relay_node_callback = tcp_relay_node_callback; + onion_c->friends_list[friend_num].tcp_relay_node_callback = callback; onion_c->friends_list[friend_num].tcp_relay_node_callback_object = object; onion_c->friends_list[friend_num].tcp_relay_node_callback_number = number; return 0; @@ -1551,15 +1551,15 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum) } } - unsigned int i, count = 0; - Onion_Node *list_nodes = onion_c->friends_list[friendnum].clients_list; - if (!onion_c->friends_list[friendnum].is_online) { + unsigned int count = 0; + Onion_Node *list_nodes = onion_c->friends_list[friendnum].clients_list; + // ensure we get a response from some node roughly once per // (interval / MAX_ONION_CLIENTS) bool ping_random = true; - for (i = 0; i < MAX_ONION_CLIENTS; ++i) { + for (unsigned i = 0; i < MAX_ONION_CLIENTS; ++i) { if (!(is_timeout(list_nodes[i].timestamp, interval / MAX_ONION_CLIENTS) && is_timeout(list_nodes[i].last_pinged, ONION_NODE_PING_INTERVAL))) { ping_random = false; @@ -1567,7 +1567,7 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum) } } - for (i = 0; i < MAX_ONION_CLIENTS; ++i) { + for (unsigned i = 0; i < MAX_ONION_CLIENTS; ++i) { if (onion_node_timed_out(&list_nodes[i])) { continue; } @@ -1586,7 +1586,8 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum) if (is_timeout(list_nodes[i].last_pinged, interval) || (ping_random && rand() % (MAX_ONION_CLIENTS - i) == 0)) { - if (client_send_announce_request(onion_c, friendnum + 1, list_nodes[i].ip_port, list_nodes[i].public_key, 0, ~0) == 0) { + if (client_send_announce_request(onion_c, friendnum + 1, list_nodes[i].ip_port, + list_nodes[i].public_key, nullptr, ~0) == 0) { list_nodes[i].last_pinged = unix_time(); ++list_nodes[i].unsuccessful_pings; ping_random = false; @@ -1610,7 +1611,7 @@ static void do_friend(Onion_Client *onion_c, uint16_t friendnum) for (j = 0; j < n; ++j) { unsigned int num = rand() % num_nodes; client_send_announce_request(onion_c, friendnum + 1, onion_c->path_nodes[num].ip_port, - onion_c->path_nodes[num].public_key, 0, ~0); + onion_c->path_nodes[num].public_key, nullptr, ~0); } ++onion_c->friends_list[friendnum].run_count; @@ -1729,7 +1730,7 @@ static void do_announce(Onion_Client *onion_c) if (num_nodes != 0) { for (i = 0; i < (MAX_ONION_CLIENTS_ANNOUNCE / 2); ++i) { unsigned int num = rand() % num_nodes; - client_send_announce_request(onion_c, 0, path_nodes[num].ip_port, path_nodes[num].public_key, 0, ~0); + client_send_announce_request(onion_c, 0, path_nodes[num].ip_port, path_nodes[num].public_key, nullptr, ~0); } } } @@ -1799,8 +1800,6 @@ unsigned int onion_connection_status(const Onion_Client *onion_c) void do_onion_client(Onion_Client *onion_c) { - unsigned int i; - if (onion_c->last_run == unix_time()) { return; } @@ -1832,7 +1831,7 @@ void do_onion_client(Onion_Client *onion_c) || get_random_tcp_onion_conn_number(nc_get_tcp_c(onion_c->c)) == -1; /* Check if connected to any TCP relays. */ if (onion_connection_status(onion_c)) { - for (i = 0; i < onion_c->num_friends; ++i) { + for (unsigned i = 0; i < onion_c->num_friends; ++i) { do_friend(onion_c, i); } } @@ -1846,25 +1845,25 @@ void do_onion_client(Onion_Client *onion_c) Onion_Client *new_onion_client(Net_Crypto *c) { - if (c == NULL) { - return NULL; + if (c == nullptr) { + return nullptr; } Onion_Client *onion_c = (Onion_Client *)calloc(1, sizeof(Onion_Client)); - if (onion_c == NULL) { - return NULL; + if (onion_c == nullptr) { + return nullptr; } onion_c->announce_ping_array = ping_array_new(ANNOUNCE_ARRAY_SIZE, ANNOUNCE_TIMEOUT); - if (onion_c->announce_ping_array == NULL) { + if (onion_c->announce_ping_array == nullptr) { free(onion_c); - return NULL; + return nullptr; } onion_c->dht = nc_get_dht(c); - onion_c->net = onion_c->dht->net; + onion_c->net = dht_get_net(onion_c->dht); onion_c->c = c; new_symmetric_key(onion_c->secret_symmetric_key); crypto_new_keypair(onion_c->temp_public_key, onion_c->temp_secret_key); @@ -1879,17 +1878,17 @@ Onion_Client *new_onion_client(Net_Crypto *c) void kill_onion_client(Onion_Client *onion_c) { - if (onion_c == NULL) { + if (onion_c == nullptr) { return; } ping_array_kill(onion_c->announce_ping_array); realloc_onion_friends(onion_c, 0); - networking_registerhandler(onion_c->net, NET_PACKET_ANNOUNCE_RESPONSE, NULL, NULL); - networking_registerhandler(onion_c->net, NET_PACKET_ONION_DATA_RESPONSE, NULL, NULL); - oniondata_registerhandler(onion_c, ONION_DATA_DHTPK, NULL, NULL); - cryptopacket_registerhandler(onion_c->dht, CRYPTO_PACKET_DHTPK, NULL, NULL); - set_onion_packet_tcp_connection_callback(nc_get_tcp_c(onion_c->c), NULL, NULL); + networking_registerhandler(onion_c->net, NET_PACKET_ANNOUNCE_RESPONSE, nullptr, nullptr); + networking_registerhandler(onion_c->net, NET_PACKET_ONION_DATA_RESPONSE, nullptr, nullptr); + oniondata_registerhandler(onion_c, ONION_DATA_DHTPK, nullptr, nullptr); + cryptopacket_registerhandler(onion_c->dht, CRYPTO_PACKET_DHTPK, nullptr, nullptr); + set_onion_packet_tcp_connection_callback(nc_get_tcp_c(onion_c->c), nullptr, nullptr); crypto_memzero(onion_c, sizeof(Onion_Client)); free(onion_c); } diff --git a/protocols/Tox/libtox/src/toxcore/ping.c b/protocols/Tox/libtox/src/toxcore/ping.c index f2f560136f..bede07a117 100644 --- a/protocols/Tox/libtox/src/toxcore/ping.c +++ b/protocols/Tox/libtox/src/toxcore/ping.c @@ -64,7 +64,7 @@ int32_t ping_send_request(Ping *ping, IP_Port ipp, const uint8_t *public_key) int rc; uint64_t ping_id; - if (id_equal(public_key, ping->dht->self_public_key)) { + if (id_equal(public_key, dht_get_self_public_key(ping->dht))) { return 1; } @@ -87,7 +87,7 @@ int32_t ping_send_request(Ping *ping, IP_Port ipp, const uint8_t *public_key) memcpy(ping_plain + 1, &ping_id, sizeof(ping_id)); pk[0] = NET_PACKET_PING_REQUEST; - id_copy(pk + 1, ping->dht->self_public_key); // Our pubkey + id_copy(pk + 1, dht_get_self_public_key(ping->dht)); // Our pubkey random_nonce(pk + 1 + CRYPTO_PUBLIC_KEY_SIZE); // Generate new nonce @@ -100,7 +100,7 @@ int32_t ping_send_request(Ping *ping, IP_Port ipp, const uint8_t *public_key) return 1; } - return sendpacket(ping->dht->net, ipp, pk, sizeof(pk)); + return sendpacket(dht_get_net(ping->dht), ipp, pk, sizeof(pk)); } static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key, uint64_t ping_id, @@ -109,7 +109,7 @@ static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key uint8_t pk[DHT_PING_SIZE]; int rc; - if (id_equal(public_key, ping->dht->self_public_key)) { + if (id_equal(public_key, dht_get_self_public_key(ping->dht))) { return 1; } @@ -118,7 +118,7 @@ static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key memcpy(ping_plain + 1, &ping_id, sizeof(ping_id)); pk[0] = NET_PACKET_PING_RESPONSE; - id_copy(pk + 1, ping->dht->self_public_key); // Our pubkey + id_copy(pk + 1, dht_get_self_public_key(ping->dht)); // Our pubkey random_nonce(pk + 1 + CRYPTO_PUBLIC_KEY_SIZE); // Generate new nonce // Encrypt ping_id using recipient privkey @@ -131,7 +131,7 @@ static int ping_send_response(Ping *ping, IP_Port ipp, const uint8_t *public_key return 1; } - return sendpacket(ping->dht->net, ipp, pk, sizeof(pk)); + return sendpacket(dht_get_net(ping->dht), ipp, pk, sizeof(pk)); } static int handle_ping_request(void *object, IP_Port source, const uint8_t *packet, uint16_t length, void *userdata) @@ -143,9 +143,9 @@ static int handle_ping_request(void *object, IP_Port source, const uint8_t *pack return 1; } - Ping *ping = dht->ping; + Ping *ping = dht_get_ping(dht); - if (id_equal(packet + 1, ping->dht->self_public_key)) { + if (id_equal(packet + 1, dht_get_self_public_key(ping->dht))) { return 1; } @@ -186,9 +186,9 @@ static int handle_ping_response(void *object, IP_Port source, const uint8_t *pac return 1; } - Ping *ping = dht->ping; + Ping *ping = dht_get_ping(dht); - if (id_equal(packet + 1, ping->dht->self_public_key)) { + if (id_equal(packet + 1, dht_get_self_public_key(ping->dht))) { return 1; } @@ -284,7 +284,7 @@ int32_t ping_add(Ping *ping, const uint8_t *public_key, IP_Port ip_port) return -1; } - if (in_list(ping->dht->close_clientlist, LCLIENT_LIST, public_key, ip_port)) { + if (in_list(dht_get_close_clientlist(ping->dht), LCLIENT_LIST, public_key, ip_port)) { return -1; } @@ -309,7 +309,7 @@ int32_t ping_add(Ping *ping, const uint8_t *public_key, IP_Port ip_port) } } - if (add_to_list(ping->to_ping, MAX_TO_PING, public_key, ip_port, ping->dht->self_public_key)) { + if (add_to_list(ping->to_ping, MAX_TO_PING, public_key, ip_port, dht_get_self_public_key(ping->dht))) { return 0; } @@ -355,28 +355,28 @@ Ping *ping_new(DHT *dht) { Ping *ping = (Ping *)calloc(1, sizeof(Ping)); - if (ping == NULL) { - return NULL; + if (ping == nullptr) { + return nullptr; } ping->ping_array = ping_array_new(PING_NUM_MAX, PING_TIMEOUT); - if (ping->ping_array == NULL) { + if (ping->ping_array == nullptr) { free(ping); - return NULL; + return nullptr; } ping->dht = dht; - networking_registerhandler(ping->dht->net, NET_PACKET_PING_REQUEST, &handle_ping_request, dht); - networking_registerhandler(ping->dht->net, NET_PACKET_PING_RESPONSE, &handle_ping_response, dht); + networking_registerhandler(dht_get_net(ping->dht), NET_PACKET_PING_REQUEST, &handle_ping_request, dht); + networking_registerhandler(dht_get_net(ping->dht), NET_PACKET_PING_RESPONSE, &handle_ping_response, dht); return ping; } void ping_kill(Ping *ping) { - networking_registerhandler(ping->dht->net, NET_PACKET_PING_REQUEST, NULL, NULL); - networking_registerhandler(ping->dht->net, NET_PACKET_PING_RESPONSE, NULL, NULL); + networking_registerhandler(dht_get_net(ping->dht), NET_PACKET_PING_REQUEST, nullptr, nullptr); + networking_registerhandler(dht_get_net(ping->dht), NET_PACKET_PING_RESPONSE, nullptr, nullptr); ping_array_kill(ping->ping_array); free(ping); diff --git a/protocols/Tox/libtox/src/toxcore/ping_array.c b/protocols/Tox/libtox/src/toxcore/ping_array.c index 627f8d5a64..a54ebfe209 100644 --- a/protocols/Tox/libtox/src/toxcore/ping_array.c +++ b/protocols/Tox/libtox/src/toxcore/ping_array.c @@ -57,20 +57,20 @@ struct Ping_Array { Ping_Array *ping_array_new(uint32_t size, uint32_t timeout) { if (size == 0 || timeout == 0) { - return NULL; + return nullptr; } Ping_Array *empty_array = (Ping_Array *)calloc(1, sizeof(Ping_Array)); - if (empty_array == NULL) { - return NULL; + if (empty_array == nullptr) { + return nullptr; } empty_array->entries = (Ping_Array_Entry *)calloc(size, sizeof(Ping_Array_Entry)); - if (empty_array->entries == NULL) { + if (empty_array->entries == nullptr) { free(empty_array); - return NULL; + return nullptr; } empty_array->last_deleted = empty_array->last_added = 0; @@ -82,7 +82,7 @@ Ping_Array *ping_array_new(uint32_t size, uint32_t timeout) static void clear_entry(Ping_Array *array, uint32_t index) { free(array->entries[index].data); - array->entries[index].data = NULL; + array->entries[index].data = nullptr; array->entries[index].length = array->entries[index].time = array->entries[index].ping_id = 0; @@ -128,14 +128,14 @@ uint64_t ping_array_add(Ping_Array *array, const uint8_t *data, uint32_t length) ping_array_clear_timedout(array); uint32_t index = array->last_added % array->total_size; - if (array->entries[index].data != NULL) { + if (array->entries[index].data != nullptr) { array->last_deleted = array->last_added - array->total_size; clear_entry(array, index); } array->entries[index].data = malloc(length); - if (array->entries[index].data == NULL) { + if (array->entries[index].data == nullptr) { return 0; } @@ -184,7 +184,7 @@ int32_t ping_array_check(Ping_Array *array, uint8_t *data, size_t length, uint64 return -1; } - if (array->entries[index].data == NULL) { + if (array->entries[index].data == nullptr) { return -1; } diff --git a/protocols/Tox/libtox/src/toxcore/tox.api.h b/protocols/Tox/libtox/src/toxcore/tox.api.h index 7f3d8d4cff..59af69b9c3 100644 --- a/protocols/Tox/libtox/src/toxcore/tox.api.h +++ b/protocols/Tox/libtox/src/toxcore/tox.api.h @@ -188,19 +188,19 @@ const VERSION_PATCH = 0; * features, but can't break the API. */ #define TOX_VERSION_IS_API_COMPATIBLE(MAJOR, MINOR, PATCH) \ - (TOX_VERSION_MAJOR > 0 && TOX_VERSION_MAJOR == MAJOR) && ( \ + ((TOX_VERSION_MAJOR > 0 && TOX_VERSION_MAJOR == MAJOR) && ( \ /* 1.x.x, 2.x.x, etc. with matching major version. */ \ TOX_VERSION_MINOR > MINOR || \ - TOX_VERSION_MINOR == MINOR && TOX_VERSION_PATCH >= PATCH \ - ) || (TOX_VERSION_MAJOR == 0 && MAJOR == 0) && ( \ + (TOX_VERSION_MINOR == MINOR && TOX_VERSION_PATCH >= PATCH) \ + )) || ((TOX_VERSION_MAJOR == 0 && MAJOR == 0) && ( \ /* 0.x.x makes minor behave like major above. */ \ - (TOX_VERSION_MINOR > 0 && TOX_VERSION_MINOR == MINOR) && ( \ + ((TOX_VERSION_MINOR > 0 && TOX_VERSION_MINOR == MINOR) && ( \ TOX_VERSION_PATCH >= PATCH \ - ) || (TOX_VERSION_MINOR == 0 && MINOR == 0) && ( \ + )) || ((TOX_VERSION_MINOR == 0 && MINOR == 0) && ( \ /* 0.0.x and 0.0.y are only compatible if x == y. */ \ TOX_VERSION_PATCH == PATCH \ - ) \ - ) + )) \ + )) static namespace version { @@ -257,26 +257,36 @@ const ADDRESS_SIZE = PUBLIC_KEY_SIZE + NOSPAM_SIZE + sizeof(uint1 /** * Maximum length of a nickname in bytes. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ const MAX_NAME_LENGTH = 128; /** * Maximum length of a status message in bytes. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ const MAX_STATUS_MESSAGE_LENGTH = 1007; /** * Maximum length of a friend request message in bytes. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ const MAX_FRIEND_REQUEST_LENGTH = 1016; /** * Maximum length of a single message after which it should be split. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ const MAX_MESSAGE_LENGTH = 1372; /** * Maximum size of custom packets. TODO(iphydf): should be LENGTH? + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ const MAX_CUSTOM_PACKET_SIZE = 1373; @@ -292,6 +302,8 @@ const FILE_ID_LENGTH = 32; /** * Maximum file name length for file transfers. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ const MAX_FILENAME_LENGTH = 255; @@ -338,11 +350,6 @@ enum class MESSAGE_TYPE { * on IRC. */ ACTION, - /** - * Correction of the last message. With empty message body can be used to mark - * last message as deleted. - */ - CORRECTION, } @@ -448,7 +455,7 @@ static class options { * @deprecated The memory layout of this struct (size, alignment, and field * order) is not part of the ABI. To remain compatible, prefer to use $new to * allocate the object and accessor functions to set the members. The struct - * will become opaque (i.e. the definition will become private) in v0.2.0. + * will become opaque (i.e. the definition will become private) in v0.3.0. */ struct this [get, set] { /** @@ -806,6 +813,9 @@ inline namespace self { /** * Return whether we are connected to the DHT. The return value is equal to the * last value received through the `${event connection_status}` callback. + * + * @deprecated This getter is deprecated. Use the event and store the status + * in the client state. */ get(); } @@ -1222,11 +1232,11 @@ namespace friend { uint64_t last_online { /** - * Return a unix-time timestamp of the last time the friend associated with a given - * friend number was seen online. This function will return UINT64_MAX on error. - * - * @param friend_number The friend number you want to query. - */ + * Return a unix-time timestamp of the last time the friend associated with a given + * friend number was seen online. This function will return UINT64_MAX on error. + * + * @param friend_number The friend number you want to query. + */ get(uint32_t friend_number) { /** * No friend with the given number exists on the friend list. @@ -1356,6 +1366,9 @@ namespace friend { * * The status returned is equal to the last status received through the * `${event status}` callback. + * + * @deprecated This getter is deprecated. Use the event and store the status + * in the client state. */ get(uint32_t friend_number) with error for query; @@ -1387,6 +1400,9 @@ namespace friend { * * @return the friend's connection status as it was received through the * `${event connection_status}` event. + * + * @deprecated This getter is deprecated. Use the event and store the status + * in the client state. */ get(uint32_t friend_number) with error for query; @@ -1420,6 +1436,9 @@ namespace friend { * @return true if the friend is typing. * @return false if the friend is not typing, or the friend number was * invalid. Inspect the error code to determine which case it is. + * + * @deprecated This getter is deprecated. Use the event and store the status + * in the client state. */ get(uint32_t friend_number) with error for query; @@ -2110,34 +2129,33 @@ namespace conference { typedef void(uint32_t conference_number, uint32_t peer_number, const uint8_t[length] title); } - /** - * Peer list state change types. - */ - enum class STATE_CHANGE { - /** - * A peer has joined the conference. - */ - PEER_JOIN, - /** - * A peer has exited the conference. - */ - PEER_EXIT, + namespace peer { + /** - * A peer has changed their name. + * This event is triggered when a peer changes their name. */ - PEER_NAME_CHANGE, - } + event name const { + /** + * @param conference_number The conference number of the conference the + * peer is in. + * @param peer_number The ID of the peer who changed their nickname. + * @param name A byte array containing the new nickname. + * @param length The size of the name byte array. + */ + typedef void(uint32_t conference_number, uint32_t peer_number, const uint8_t[length] name); + } - /** - * This event is triggered when the peer list changes (name change, peer join, peer exit). - */ - event namelist_change const { /** - * @param conference_number The conference number of the conference the title change is intended for. - * @param peer_number The ID of the peer who changed the title. - * @param change The type of change (one of $STATE_CHANGE). + * This event is triggered when a peer joins or leaves the conference. */ - typedef void(uint32_t conference_number, uint32_t peer_number, STATE_CHANGE change); + event list_changed const { + /** + * @param conference_number The conference number of the conference the + * peer is in. + */ + typedef void(uint32_t conference_number); + } + } diff --git a/protocols/Tox/libtox/src/toxcore/tox.c b/protocols/Tox/libtox/src/toxcore/tox.c index 2fd478dc8c..3db2bd35f3 100644 --- a/protocols/Tox/libtox/src/toxcore/tox.c +++ b/protocols/Tox/libtox/src/toxcore/tox.c @@ -82,37 +82,37 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error) { Messenger_Options m_options = {0}; - bool load_savedata_sk = 0, load_savedata_tox = 0; + bool load_savedata_sk = false, load_savedata_tox = false; - if (options == NULL) { + if (options == nullptr) { m_options.ipv6enabled = TOX_ENABLE_IPV6_DEFAULT; } else { if (tox_options_get_savedata_type(options) != TOX_SAVEDATA_TYPE_NONE) { - if (tox_options_get_savedata_data(options) == NULL || tox_options_get_savedata_length(options) == 0) { + if (tox_options_get_savedata_data(options) == nullptr || tox_options_get_savedata_length(options) == 0) { SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT); - return NULL; + return nullptr; } } if (tox_options_get_savedata_type(options) == TOX_SAVEDATA_TYPE_SECRET_KEY) { if (tox_options_get_savedata_length(options) != TOX_SECRET_KEY_SIZE) { SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT); - return NULL; + return nullptr; } - load_savedata_sk = 1; + load_savedata_sk = true; } else if (tox_options_get_savedata_type(options) == TOX_SAVEDATA_TYPE_TOX_SAVE) { if (tox_options_get_savedata_length(options) < TOX_ENC_SAVE_MAGIC_LENGTH) { SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_BAD_FORMAT); - return NULL; + return nullptr; } if (crypto_memcmp(tox_options_get_savedata_data(options), TOX_ENC_SAVE_MAGIC_NUMBER, TOX_ENC_SAVE_MAGIC_LENGTH) == 0) { SET_ERROR_PARAMETER(error, TOX_ERR_NEW_LOAD_ENCRYPTED); - return NULL; + return nullptr; } - load_savedata_tox = 1; + load_savedata_tox = true; } m_options.ipv6enabled = tox_options_get_ipv6_enabled(options); @@ -141,13 +141,13 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error) default: SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_TYPE); - return NULL; + return nullptr; } if (m_options.proxy_info.proxy_type != TCP_PROXY_NONE) { if (tox_options_get_proxy_port(options) == 0) { SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_PORT); - return NULL; + return nullptr; } ip_init(&m_options.proxy_info.ip_port.ip, m_options.ipv6enabled); @@ -156,10 +156,10 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error) m_options.proxy_info.ip_port.ip.family = TOX_AF_UNSPEC; } - if (!addr_resolve_or_parse_ip(tox_options_get_proxy_host(options), &m_options.proxy_info.ip_port.ip, NULL)) { + if (addr_resolve_or_parse_ip(tox_options_get_proxy_host(options), &m_options.proxy_info.ip_port.ip, nullptr) == 0) { SET_ERROR_PARAMETER(error, TOX_ERR_NEW_PROXY_BAD_HOST); // TODO(irungentoo): TOX_ERR_NEW_PROXY_NOT_FOUND if domain. - return NULL; + return nullptr; } m_options.proxy_info.ip_port.port = net_htons(tox_options_get_proxy_port(options)); @@ -180,7 +180,7 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error) SET_ERROR_PARAMETER(error, TOX_ERR_NEW_MALLOC); } - return NULL; + return nullptr; } if (load_savedata_tox @@ -198,7 +198,7 @@ Tox *tox_new(const struct Tox_Options *options, TOX_ERR_NEW *error) void tox_kill(Tox *tox) { - if (tox == NULL) { + if (tox == nullptr) { return; } @@ -457,7 +457,8 @@ void tox_self_set_status(Tox *tox, TOX_USER_STATUS status) TOX_USER_STATUS tox_self_get_status(const Tox *tox) { const Messenger *m = tox; - return (TOX_USER_STATUS)m_get_self_userstatus(m); + const uint8_t status = m_get_self_userstatus(m); + return (TOX_USER_STATUS)status; } static void set_friend_error(int32_t ret, TOX_ERR_FRIEND_ADD *error) @@ -1103,11 +1104,16 @@ void tox_callback_conference_title(Tox *tox, tox_conference_title_cb *callback) g_callback_group_title((Group_Chats *)m->conferences_object, callback); } -void tox_callback_conference_namelist_change(Tox *tox, tox_conference_namelist_change_cb *callback) +void tox_callback_conference_peer_name(Tox *tox, tox_conference_peer_name_cb *callback) { Messenger *m = tox; - g_callback_group_namelistchange((Group_Chats *)m->conferences_object, (void (*)(struct Messenger *, int, int, uint8_t, - void *))callback); + g_callback_peer_name((Group_Chats *)m->conferences_object, callback); +} + +void tox_callback_conference_peer_list_changed(Tox *tox, tox_conference_peer_list_changed_cb *callback) +{ + Messenger *m = tox; + g_callback_peer_list_changed((Group_Chats *)m->conferences_object, callback); } uint32_t tox_conference_new(Tox *tox, TOX_ERR_CONFERENCE_NEW *error) @@ -1519,7 +1525,7 @@ void tox_self_get_dht_id(const Tox *tox, uint8_t *dht_id) { if (dht_id) { const Messenger *m = tox; - memcpy(dht_id, m->dht->self_public_key, CRYPTO_PUBLIC_KEY_SIZE); + memcpy(dht_id, dht_get_self_public_key(m->dht), CRYPTO_PUBLIC_KEY_SIZE); } } diff --git a/protocols/Tox/libtox/src/toxcore/tox.h b/protocols/Tox/libtox/src/toxcore/tox.h index f4f3d06639..41a0994ed6 100644 --- a/protocols/Tox/libtox/src/toxcore/tox.h +++ b/protocols/Tox/libtox/src/toxcore/tox.h @@ -191,19 +191,19 @@ uint32_t tox_version_patch(void); * features, but can't break the API. */ #define TOX_VERSION_IS_API_COMPATIBLE(MAJOR, MINOR, PATCH) \ - (TOX_VERSION_MAJOR > 0 && TOX_VERSION_MAJOR == MAJOR) && ( \ + ((TOX_VERSION_MAJOR > 0 && TOX_VERSION_MAJOR == MAJOR) && ( \ /* 1.x.x, 2.x.x, etc. with matching major version. */ \ TOX_VERSION_MINOR > MINOR || \ - TOX_VERSION_MINOR == MINOR && TOX_VERSION_PATCH >= PATCH \ - ) || (TOX_VERSION_MAJOR == 0 && MAJOR == 0) && ( \ + (TOX_VERSION_MINOR == MINOR && TOX_VERSION_PATCH >= PATCH) \ + )) || ((TOX_VERSION_MAJOR == 0 && MAJOR == 0) && ( \ /* 0.x.x makes minor behave like major above. */ \ - (TOX_VERSION_MINOR > 0 && TOX_VERSION_MINOR == MINOR) && ( \ + ((TOX_VERSION_MINOR > 0 && TOX_VERSION_MINOR == MINOR) && ( \ TOX_VERSION_PATCH >= PATCH \ - ) || (TOX_VERSION_MINOR == 0 && MINOR == 0) && ( \ + )) || ((TOX_VERSION_MINOR == 0 && MINOR == 0) && ( \ /* 0.0.x and 0.0.y are only compatible if x == y. */ \ TOX_VERSION_PATCH == PATCH \ - ) \ - ) + )) \ + )) /** * Return whether the compiled library version is compatible with the passed @@ -266,6 +266,8 @@ uint32_t tox_address_size(void); /** * Maximum length of a nickname in bytes. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ #define TOX_MAX_NAME_LENGTH 128 @@ -273,6 +275,8 @@ uint32_t tox_max_name_length(void); /** * Maximum length of a status message in bytes. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ #define TOX_MAX_STATUS_MESSAGE_LENGTH 1007 @@ -280,6 +284,8 @@ uint32_t tox_max_status_message_length(void); /** * Maximum length of a friend request message in bytes. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ #define TOX_MAX_FRIEND_REQUEST_LENGTH 1016 @@ -287,6 +293,8 @@ uint32_t tox_max_friend_request_length(void); /** * Maximum length of a single message after which it should be split. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ #define TOX_MAX_MESSAGE_LENGTH 1372 @@ -294,6 +302,8 @@ uint32_t tox_max_message_length(void); /** * Maximum size of custom packets. TODO(iphydf): should be LENGTH? + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ #define TOX_MAX_CUSTOM_PACKET_SIZE 1373 @@ -315,6 +325,8 @@ uint32_t tox_file_id_length(void); /** * Maximum file name length for file transfers. + * + * @deprecated The macro will be removed in 0.3.0. Use the function instead. */ #define TOX_MAX_FILENAME_LENGTH 255 @@ -371,12 +383,6 @@ typedef enum TOX_MESSAGE_TYPE { */ TOX_MESSAGE_TYPE_ACTION, - /** - * Correction of the last message. With empty message body can be used to mark - * last message as deleted. - */ - TOX_MESSAGE_TYPE_CORRECTION, - } TOX_MESSAGE_TYPE; @@ -500,7 +506,7 @@ typedef void tox_log_cb(Tox *tox, TOX_LOG_LEVEL level, const char *file, uint32_ * @deprecated The memory layout of this struct (size, alignment, and field * order) is not part of the ABI. To remain compatible, prefer to use tox_options_new to * allocate the object and accessor functions to set the members. The struct - * will become opaque (i.e. the definition will become private) in v0.2.0. + * will become opaque (i.e. the definition will become private) in v0.3.0. */ struct Tox_Options { @@ -962,6 +968,9 @@ typedef enum TOX_CONNECTION { /** * Return whether we are connected to the DHT. The return value is equal to the * last value received through the `self_connection_status` callback. + * + * @deprecated This getter is deprecated. Use the event and store the status + * in the client state. */ TOX_CONNECTION tox_self_get_connection_status(const Tox *tox); @@ -1531,6 +1540,9 @@ void tox_callback_friend_status_message(Tox *tox, tox_friend_status_message_cb * * * The status returned is equal to the last status received through the * `friend_status` callback. + * + * @deprecated This getter is deprecated. Use the event and store the status + * in the client state. */ TOX_USER_STATUS tox_friend_get_status(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error); @@ -1560,6 +1572,9 @@ void tox_callback_friend_status(Tox *tox, tox_friend_status_cb *callback); * * @return the friend's connection status as it was received through the * `friend_connection_status` event. + * + * @deprecated This getter is deprecated. Use the event and store the status + * in the client state. */ TOX_CONNECTION tox_friend_get_connection_status(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error); @@ -1592,6 +1607,9 @@ void tox_callback_friend_connection_status(Tox *tox, tox_friend_connection_statu * @return true if the friend is typing. * @return false if the friend is not typing, or the friend number was * invalid. Inspect the error code to determine which case it is. + * + * @deprecated This getter is deprecated. Use the event and store the status + * in the client state. */ bool tox_friend_get_typing(const Tox *tox, uint32_t friend_number, TOX_ERR_FRIEND_QUERY *error); @@ -2394,43 +2412,36 @@ typedef void tox_conference_title_cb(Tox *tox, uint32_t conference_number, uint3 void tox_callback_conference_title(Tox *tox, tox_conference_title_cb *callback); /** - * Peer list state change types. + * @param conference_number The conference number of the conference the + * peer is in. + * @param peer_number The ID of the peer who changed their nickname. + * @param name A byte array containing the new nickname. + * @param length The size of the name byte array. */ -typedef enum TOX_CONFERENCE_STATE_CHANGE { +typedef void tox_conference_peer_name_cb(Tox *tox, uint32_t conference_number, uint32_t peer_number, + const uint8_t *name, size_t length, void *user_data); - /** - * A peer has joined the conference. - */ - TOX_CONFERENCE_STATE_CHANGE_PEER_JOIN, - - /** - * A peer has exited the conference. - */ - TOX_CONFERENCE_STATE_CHANGE_PEER_EXIT, - - /** - * A peer has changed their name. - */ - TOX_CONFERENCE_STATE_CHANGE_PEER_NAME_CHANGE, - -} TOX_CONFERENCE_STATE_CHANGE; +/** + * Set the callback for the `conference_peer_name` event. Pass NULL to unset. + * + * This event is triggered when a peer changes their name. + */ +void tox_callback_conference_peer_name(Tox *tox, tox_conference_peer_name_cb *callback); /** - * @param conference_number The conference number of the conference the title change is intended for. - * @param peer_number The ID of the peer who changed the title. - * @param change The type of change (one of TOX_CONFERENCE_STATE_CHANGE). + * @param conference_number The conference number of the conference the + * peer is in. */ -typedef void tox_conference_namelist_change_cb(Tox *tox, uint32_t conference_number, uint32_t peer_number, - TOX_CONFERENCE_STATE_CHANGE change, void *user_data); +typedef void tox_conference_peer_list_changed_cb(Tox *tox, uint32_t conference_number, void *user_data); /** - * Set the callback for the `conference_namelist_change` event. Pass NULL to unset. + * Set the callback for the `conference_peer_list_changed` event. Pass NULL to unset. * - * This event is triggered when the peer list changes (name change, peer join, peer exit). + * This event is triggered when a peer joins or leaves the conference. */ -void tox_callback_conference_namelist_change(Tox *tox, tox_conference_namelist_change_cb *callback); +void tox_callback_conference_peer_list_changed(Tox *tox, tox_conference_peer_list_changed_cb *callback); typedef enum TOX_ERR_CONFERENCE_NEW { diff --git a/protocols/Tox/libtox/src/toxcore/tox_api.c b/protocols/Tox/libtox/src/toxcore/tox_api.c index b6c8c38618..6c0bd71fca 100644 --- a/protocols/Tox/libtox/src/toxcore/tox_api.c +++ b/protocols/Tox/libtox/src/toxcore/tox_api.c @@ -1,5 +1,7 @@ #include "tox.h" +#include "ccompat.h" + #include <stdlib.h> #include <string.h> @@ -38,20 +40,20 @@ void tox_options_set_##ns##name(struct Tox_Options *options, type name) \ options->ns##name = name; \ } -ACCESSORS(bool, , ipv6_enabled) -ACCESSORS(bool, , udp_enabled) -ACCESSORS(TOX_PROXY_TYPE, proxy_ , type) -ACCESSORS(const char *, proxy_ , host) -ACCESSORS(uint16_t, proxy_ , port) -ACCESSORS(uint16_t, , start_port) -ACCESSORS(uint16_t, , end_port) -ACCESSORS(uint16_t, , tcp_port) -ACCESSORS(bool, , hole_punching_enabled) +ACCESSORS(bool,, ipv6_enabled) +ACCESSORS(bool,, udp_enabled) +ACCESSORS(TOX_PROXY_TYPE, proxy_, type) +ACCESSORS(const char *, proxy_, host) +ACCESSORS(uint16_t, proxy_, port) +ACCESSORS(uint16_t,, start_port) +ACCESSORS(uint16_t,, end_port) +ACCESSORS(uint16_t,, tcp_port) +ACCESSORS(bool,, hole_punching_enabled) ACCESSORS(TOX_SAVEDATA_TYPE, savedata_, type) ACCESSORS(size_t, savedata_, length) ACCESSORS(tox_log_cb *, log_, callback) ACCESSORS(void *, log_, user_data) -ACCESSORS(bool, , local_discovery_enabled) +ACCESSORS(bool,, local_discovery_enabled) const uint8_t *tox_options_get_savedata_data(const struct Tox_Options *options) { @@ -88,7 +90,7 @@ struct Tox_Options *tox_options_new(TOX_ERR_OPTIONS_NEW *error) } SET_ERROR_PARAMETER(error, TOX_ERR_OPTIONS_NEW_MALLOC); - return NULL; + return nullptr; } void tox_options_free(struct Tox_Options *options) diff --git a/protocols/Tox/libtox/src/toxcore/util.c b/protocols/Tox/libtox/src/toxcore/util.c index 92bbb68c1f..b7a8fda653 100644 --- a/protocols/Tox/libtox/src/toxcore/util.c +++ b/protocols/Tox/libtox/src/toxcore/util.c @@ -27,7 +27,9 @@ #include "config.h" #endif +#ifndef _XOPEN_SOURCE #define _XOPEN_SOURCE 600 +#endif #include "util.h" @@ -46,7 +48,7 @@ static uint64_t unix_base_time_value; void unix_time_update(void) { if (unix_base_time_value == 0) { - unix_base_time_value = ((uint64_t)time(NULL) - (current_time_monotonic() / 1000ULL)); + unix_base_time_value = ((uint64_t)time(nullptr) - (current_time_monotonic() / 1000ULL)); } unix_time_value = (current_time_monotonic() / 1000ULL) + unix_base_time_value; @@ -128,7 +130,6 @@ int load_state(load_state_callback_func load_state_callback, Logger *log, void * } - uint16_t type; uint32_t length_sub, cookie_type; uint32_t size_head = sizeof(uint32_t) * 2; @@ -150,9 +151,8 @@ int load_state(load_state_callback_func load_state_callback, Logger *log, void * return -1; } - type = lendian_to_host16(cookie_type & 0xFFFF); - - int ret = load_state_callback(outer, data, length_sub, type); + const uint16_t type = lendian_to_host16(cookie_type & 0xFFFF); + const int ret = load_state_callback(outer, data, length_sub, type); if (ret == -1) { return -1; @@ -193,3 +193,13 @@ int create_recursive_mutex(pthread_mutex_t *mutex) return 0; } + +int32_t max_s32(int32_t a, int32_t b) +{ + return a > b ? a : b; +} + +uint64_t min_u64(uint64_t a, uint64_t b) +{ + return a < b ? a : b; +} diff --git a/protocols/Tox/libtox/src/toxcore/util.h b/protocols/Tox/libtox/src/toxcore/util.h index 8777e191d8..a9faa86349 100644 --- a/protocols/Tox/libtox/src/toxcore/util.h +++ b/protocols/Tox/libtox/src/toxcore/util.h @@ -32,6 +32,10 @@ #include "logger.h" +#ifdef __cplusplus +extern "C" { +#endif + #define MIN(a,b) (((a)<(b))?(a):(b)) #define PAIR(TYPE1__, TYPE2__) struct { TYPE1__ first; TYPE2__ second; } @@ -61,4 +65,11 @@ int load_state(load_state_callback_func load_state_callback, Logger *log, void * /* Returns -1 if failed or 0 if success */ int create_recursive_mutex(pthread_mutex_t *mutex); +int32_t max_s32(int32_t a, int32_t b); +uint64_t min_u64(uint64_t a, uint64_t b); + +#ifdef __cplusplus +} // extern "C" +#endif + #endif /* UTIL_H */ diff --git a/protocols/Tox/libtox/src/toxcore/util_test.cpp b/protocols/Tox/libtox/src/toxcore/util_test.cpp new file mode 100644 index 0000000000..8de6384848 --- /dev/null +++ b/protocols/Tox/libtox/src/toxcore/util_test.cpp @@ -0,0 +1,55 @@ +#include "util.h" + +#include "crypto_core.h" + +#include <gtest/gtest.h> + +TEST(Util, UnixTimeIncreasesOverTime) +{ + unix_time_update(); + uint64_t const start = unix_time(); + + while (start == unix_time()) { + unix_time_update(); + } + + uint64_t const end = unix_time(); + EXPECT_GT(end, start); +} + +TEST(Util, IsTimeout) +{ + uint64_t const start = unix_time(); + EXPECT_FALSE(is_timeout(start, 1)); + + while (start == unix_time()) { + unix_time_update(); + } + + EXPECT_TRUE(is_timeout(start, 1)); +} + +TEST(Util, TwoRandomIdsAreNotEqual) +{ + uint8_t pk1[CRYPTO_PUBLIC_KEY_SIZE]; + uint8_t sk1[CRYPTO_SECRET_KEY_SIZE]; + uint8_t pk2[CRYPTO_PUBLIC_KEY_SIZE]; + uint8_t sk2[CRYPTO_SECRET_KEY_SIZE]; + + crypto_new_keypair(pk1, sk1); + crypto_new_keypair(pk2, sk2); + + EXPECT_FALSE(id_equal(pk1, pk2)); +} + +TEST(Util, IdCopyMakesKeysEqual) +{ + uint8_t pk1[CRYPTO_PUBLIC_KEY_SIZE]; + uint8_t sk1[CRYPTO_SECRET_KEY_SIZE]; + uint8_t pk2[CRYPTO_PUBLIC_KEY_SIZE] = {0}; + + crypto_new_keypair(pk1, sk1); + id_copy(pk2, pk1); + + EXPECT_TRUE(id_equal(pk1, pk2)); +} diff --git a/protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c b/protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c index b7360b5650..b83d6f1c6c 100644 --- a/protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c +++ b/protocols/Tox/libtox/src/toxencryptsave/toxencryptsave.c @@ -25,6 +25,7 @@ #include "config.h" #endif +#include "../toxcore/ccompat.h" #include "../toxcore/crypto_core.h" #include "defines.h" #include "toxencryptsave.h" @@ -134,7 +135,7 @@ Tox_Pass_Key *tox_pass_key_derive_with_salt(const uint8_t *passphrase, size_t pp { if (!salt || (!passphrase && pplength != 0)) { SET_ERROR_PARAMETER(error, TOX_ERR_KEY_DERIVATION_NULL); - return NULL; + return nullptr; } uint8_t passkey[crypto_hash_sha256_BYTES]; @@ -152,7 +153,7 @@ Tox_Pass_Key *tox_pass_key_derive_with_salt(const uint8_t *passphrase, size_t pp crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE) != 0) { /* out of memory most likely */ SET_ERROR_PARAMETER(error, TOX_ERR_KEY_DERIVATION_FAILED); - return NULL; + return nullptr; } sodium_memzero(passkey, crypto_hash_sha256_BYTES); /* wipe plaintext pw */ @@ -161,7 +162,7 @@ Tox_Pass_Key *tox_pass_key_derive_with_salt(const uint8_t *passphrase, size_t pp if (!out_key) { SET_ERROR_PARAMETER(error, TOX_ERR_KEY_DERIVATION_FAILED); - return NULL; + return nullptr; } memcpy(out_key->salt, salt, crypto_pwhash_scryptsalsa208sha256_SALTBYTES); @@ -320,7 +321,7 @@ bool tox_pass_decrypt(const uint8_t *data, size_t length, const uint8_t *passphr memcpy(salt, data + TOX_ENC_SAVE_MAGIC_LENGTH, crypto_pwhash_scryptsalsa208sha256_SALTBYTES); /* derive the key */ - Tox_Pass_Key *key = tox_pass_key_derive_with_salt(passphrase, pplength, salt, NULL); + Tox_Pass_Key *key = tox_pass_key_derive_with_salt(passphrase, pplength, salt, nullptr); if (!key) { /* out of memory most likely */ |