forked from Green-Sky/tomato
Squashed 'external/toxcore/c-toxcore/' changes from 11ab1d2a723..d9b8fa6098d
d9b8fa6098d fix: Fake broadcast address for 127.x.x.x aa649165a57 chore: Add code for future netprof TCP testing 9e5693de5ac chore: add to_string functions for netprof enums 52d915e6a90 cleanup: Heap allocate network profile objects 80fabd4a729 feat: Implement Tox network profiler 05abe083cb6 cleanup: Some random cleanups, mostly related to mem. 5cca24513b8 cleanup: Check that onion IP/Port packing worked. e092ecd1244 cleanup: Use tox memory allocator in some more places. 3cfe41c7587 fix: Avoid `memcpy`-ing structs into onion ping id data. e32ac001938 fix: Add more information on why the frame was not sent. ab887003687 fix: Allow TCP connections to fail `connect` calls. 7603170e663 refactor: Use tox memory in group connection allocations. 5bd8a85eb89 cleanup: Align internal logger with external on type of source line. e9bf524d9e1 cleanup: Add missing `#include` to sort_test.cc. d10c966b998 feat: Add `to_string` functions for toxencryptsave errors. 7bfd0dc8003 docs: Update the docs for group join functions 380dde9f2ae test: Add more logging to TCP connection constructor. 0f12f384c8c cleanup: Reduce stack frame sizes to below 4096 bytes. bc43cec0626 chore: Happy new year! fbe78f1702e cleanup: Add a `TOX_HIDE_DEPRECATED` check to hide deprecated symbols. 44d9da07e77 refactor: Use tox memory for group moderation/pack allocations. 7f26d520168 refactor: Use tox memory in group chats allocations. 2f62f3d0e77 refactor: Use tox Memory for group allocations. 8a968162041 chore: Add dispatch/events headers to bazel export. 2bbfb35abf6 docs: Output the error code string instead of int. in toxav logging d55d0e4eaef cleanup: Remove redundant code for checking if group exists 2a6dc643338 chore: Upgrade dependencies for websockify. fc0650601c1 fix: Allow peers to reconnect to group chats using a password git-subtree-dir: external/toxcore/c-toxcore git-subtree-split: d9b8fa6098de6c074038b6664d2572627540b148
This commit is contained in:
@ -11,7 +11,6 @@
|
||||
|
||||
#include <assert.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "DHT.h"
|
||||
@ -22,6 +21,7 @@
|
||||
#include "group_chats.h"
|
||||
#include "group_common.h"
|
||||
#include "logger.h"
|
||||
#include "mem.h"
|
||||
#include "mono_time.h"
|
||||
#include "network.h"
|
||||
#include "util.h"
|
||||
@ -39,9 +39,9 @@ static bool array_entry_is_empty(const GC_Message_Array_Entry *array_entry)
|
||||
|
||||
/** @brief Clears an array entry. */
|
||||
non_null()
|
||||
static void clear_array_entry(GC_Message_Array_Entry *const array_entry)
|
||||
static void clear_array_entry(const Memory *mem, GC_Message_Array_Entry *const array_entry)
|
||||
{
|
||||
free(array_entry->data);
|
||||
mem_delete(mem, array_entry->data);
|
||||
|
||||
*array_entry = (GC_Message_Array_Entry) {
|
||||
nullptr
|
||||
@ -54,14 +54,14 @@ static void clear_array_entry(GC_Message_Array_Entry *const array_entry)
|
||||
* to `start_id`.
|
||||
*/
|
||||
non_null()
|
||||
static void clear_send_queue_id_range(GC_Connection *gconn, uint64_t start_id, uint64_t end_id)
|
||||
static void clear_send_queue_id_range(const Memory *mem, GC_Connection *gconn, uint64_t start_id, uint64_t end_id)
|
||||
{
|
||||
const uint16_t start_idx = gcc_get_array_index(start_id);
|
||||
const uint16_t end_idx = gcc_get_array_index(end_id);
|
||||
|
||||
for (uint16_t i = start_idx; i != end_idx; i = (i + 1) % GCC_BUFFER_SIZE) {
|
||||
GC_Message_Array_Entry *entry = &gconn->send_array[i];
|
||||
clear_array_entry(entry);
|
||||
clear_array_entry(mem, entry);
|
||||
}
|
||||
|
||||
gconn->send_message_id = start_id;
|
||||
@ -90,8 +90,8 @@ void gcc_set_recv_message_id(GC_Connection *gconn, uint64_t id)
|
||||
*
|
||||
* Return true on success.
|
||||
*/
|
||||
non_null(1, 2, 3) nullable(4)
|
||||
static bool create_array_entry(const Logger *log, const Mono_Time *mono_time, GC_Message_Array_Entry *array_entry,
|
||||
non_null(1, 2, 3, 4) nullable(5)
|
||||
static bool create_array_entry(const Logger *log, const Memory *mem, const Mono_Time *mono_time, GC_Message_Array_Entry *array_entry,
|
||||
const uint8_t *data, uint16_t length, uint8_t packet_type, uint64_t message_id)
|
||||
{
|
||||
if (!array_entry_is_empty(array_entry)) {
|
||||
@ -109,7 +109,7 @@ static bool create_array_entry(const Logger *log, const Mono_Time *mono_time, GC
|
||||
return false;
|
||||
}
|
||||
|
||||
uint8_t *entry_data = (uint8_t *)malloc(length);
|
||||
uint8_t *entry_data = (uint8_t *)mem_balloc(mem, length);
|
||||
|
||||
if (entry_data == nullptr) {
|
||||
return false;
|
||||
@ -134,9 +134,9 @@ static bool create_array_entry(const Logger *log, const Mono_Time *mono_time, GC
|
||||
*
|
||||
* Returns true and increments gconn's send_message_id on success.
|
||||
*/
|
||||
non_null(1, 2, 3) nullable(4)
|
||||
static bool add_to_send_array(const Logger *log, const Mono_Time *mono_time, GC_Connection *gconn, const uint8_t *data,
|
||||
uint16_t length, uint8_t packet_type)
|
||||
non_null(1, 2, 3, 4) nullable(5)
|
||||
static bool add_to_send_array(const Logger *log, const Memory *mem, const Mono_Time *mono_time, GC_Connection *gconn,
|
||||
const uint8_t *data, uint16_t length, uint8_t packet_type)
|
||||
{
|
||||
/* check if send_array is full */
|
||||
if ((gconn->send_message_id % GCC_BUFFER_SIZE) == (uint16_t)(gconn->send_array_start - 1)) {
|
||||
@ -147,7 +147,7 @@ static bool add_to_send_array(const Logger *log, const Mono_Time *mono_time, GC_
|
||||
const uint16_t idx = gcc_get_array_index(gconn->send_message_id);
|
||||
GC_Message_Array_Entry *array_entry = &gconn->send_array[idx];
|
||||
|
||||
if (!create_array_entry(log, mono_time, array_entry, data, length, packet_type, gconn->send_message_id)) {
|
||||
if (!create_array_entry(log, mem, mono_time, array_entry, data, length, packet_type, gconn->send_message_id)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -161,7 +161,7 @@ int gcc_send_lossless_packet(const GC_Chat *chat, GC_Connection *gconn, const ui
|
||||
{
|
||||
const uint64_t message_id = gconn->send_message_id;
|
||||
|
||||
if (!add_to_send_array(chat->log, chat->mono_time, gconn, data, length, packet_type)) {
|
||||
if (!add_to_send_array(chat->log, chat->mem, chat->mono_time, gconn, data, length, packet_type)) {
|
||||
LOGGER_WARNING(chat->log, "Failed to add payload to send array: (type: 0x%02x, length: %d)", packet_type, length);
|
||||
return -1;
|
||||
}
|
||||
@ -172,7 +172,7 @@ int gcc_send_lossless_packet(const GC_Chat *chat, GC_Connection *gconn, const ui
|
||||
if (gcc_encrypt_and_send_lossless_packet(chat, gconn, data, length, message_id, packet_type) == -1) {
|
||||
const uint16_t idx = gcc_get_array_index(message_id);
|
||||
GC_Message_Array_Entry *array_entry = &gconn->send_array[idx];
|
||||
clear_array_entry(array_entry);
|
||||
clear_array_entry(chat->mem, array_entry);
|
||||
gconn->send_message_id = message_id;
|
||||
LOGGER_ERROR(chat->log, "Failed to encrypt payload: (type: 0x%02x, length: %d)", packet_type, length);
|
||||
return -2;
|
||||
@ -196,7 +196,7 @@ bool gcc_send_lossless_packet_fragments(const GC_Chat *chat, GC_Connection *gcon
|
||||
chunk[0] = packet_type;
|
||||
memcpy(chunk + 1, data, MAX_GC_PACKET_CHUNK_SIZE - 1);
|
||||
|
||||
if (!add_to_send_array(chat->log, chat->mono_time, gconn, chunk, MAX_GC_PACKET_CHUNK_SIZE, GP_FRAGMENT)) {
|
||||
if (!add_to_send_array(chat->log, chat->mem, chat->mono_time, gconn, chunk, MAX_GC_PACKET_CHUNK_SIZE, GP_FRAGMENT)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -209,15 +209,15 @@ bool gcc_send_lossless_packet_fragments(const GC_Chat *chat, GC_Connection *gcon
|
||||
memcpy(chunk, data + processed, chunk_len);
|
||||
processed += chunk_len;
|
||||
|
||||
if (!add_to_send_array(chat->log, chat->mono_time, gconn, chunk, chunk_len, GP_FRAGMENT)) {
|
||||
clear_send_queue_id_range(gconn, start_id, gconn->send_message_id);
|
||||
if (!add_to_send_array(chat->log, chat->mem, chat->mono_time, gconn, chunk, chunk_len, GP_FRAGMENT)) {
|
||||
clear_send_queue_id_range(chat->mem, gconn, start_id, gconn->send_message_id);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
// empty packet signals the end of the sequence
|
||||
if (!add_to_send_array(chat->log, chat->mono_time, gconn, nullptr, 0, GP_FRAGMENT)) {
|
||||
clear_send_queue_id_range(gconn, start_id, gconn->send_message_id);
|
||||
if (!add_to_send_array(chat->log, chat->mem, chat->mono_time, gconn, nullptr, 0, GP_FRAGMENT)) {
|
||||
clear_send_queue_id_range(chat->mem, gconn, start_id, gconn->send_message_id);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -241,7 +241,7 @@ bool gcc_send_lossless_packet_fragments(const GC_Chat *chat, GC_Connection *gcon
|
||||
return true;
|
||||
}
|
||||
|
||||
bool gcc_handle_ack(const Logger *log, GC_Connection *gconn, uint64_t message_id)
|
||||
bool gcc_handle_ack(const Logger *log, const Memory *mem, GC_Connection *gconn, uint64_t message_id)
|
||||
{
|
||||
uint16_t idx = gcc_get_array_index(message_id);
|
||||
GC_Message_Array_Entry *array_entry = &gconn->send_array[idx];
|
||||
@ -255,7 +255,7 @@ bool gcc_handle_ack(const Logger *log, GC_Connection *gconn, uint64_t message_id
|
||||
return false;
|
||||
}
|
||||
|
||||
clear_array_entry(array_entry);
|
||||
clear_array_entry(mem, array_entry);
|
||||
|
||||
/* Put send_array_start in proper position */
|
||||
if (idx == gconn->send_array_start) {
|
||||
@ -336,15 +336,15 @@ int gcc_save_tcp_relay(const Random *rng, GC_Connection *gconn, const Node_forma
|
||||
*
|
||||
* Return true on success.
|
||||
*/
|
||||
non_null(1, 2, 3) nullable(4)
|
||||
static bool store_in_recv_array(const Logger *log, const Mono_Time *mono_time, GC_Connection *gconn,
|
||||
const uint8_t *data,
|
||||
non_null(1, 2, 3, 4) nullable(5)
|
||||
static bool store_in_recv_array(const Logger *log, const Memory *mem, const Mono_Time *mono_time,
|
||||
GC_Connection *gconn, const uint8_t *data,
|
||||
uint16_t length, uint8_t packet_type, uint64_t message_id)
|
||||
{
|
||||
const uint16_t idx = gcc_get_array_index(message_id);
|
||||
GC_Message_Array_Entry *ary_entry = &gconn->recv_array[idx];
|
||||
|
||||
return create_array_entry(log, mono_time, ary_entry, data, length, packet_type, message_id);
|
||||
return create_array_entry(log, mem, mono_time, ary_entry, data, length, packet_type, message_id);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -358,8 +358,8 @@ static bool store_in_recv_array(const Logger *log, const Mono_Time *mono_time, G
|
||||
* Return the length of the fully reassembled packet on success.
|
||||
* Return 0 on failure.
|
||||
*/
|
||||
non_null(1, 3) nullable(2)
|
||||
static uint16_t reassemble_packet(const Logger *log, GC_Connection *gconn, uint8_t **payload, uint64_t message_id)
|
||||
non_null(1, 2, 4) nullable(3)
|
||||
static uint16_t reassemble_packet(const Logger *log, const Memory *mem, GC_Connection *gconn, uint8_t **payload, uint64_t message_id)
|
||||
{
|
||||
uint16_t end_idx = gcc_get_array_index(message_id - 1);
|
||||
uint16_t start_idx = end_idx;
|
||||
@ -395,7 +395,7 @@ static uint16_t reassemble_packet(const Logger *log, GC_Connection *gconn, uint8
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint8_t *tmp_payload = (uint8_t *)malloc(packet_length);
|
||||
uint8_t *tmp_payload = (uint8_t *)mem_balloc(mem, packet_length);
|
||||
|
||||
if (tmp_payload == nullptr) {
|
||||
LOGGER_ERROR(log, "Failed to allocate %u bytes for payload buffer", packet_length);
|
||||
@ -414,7 +414,7 @@ static uint16_t reassemble_packet(const Logger *log, GC_Connection *gconn, uint8
|
||||
memcpy(tmp_payload + processed, entry->data, entry->data_length);
|
||||
processed += entry->data_length;
|
||||
|
||||
clear_array_entry(entry);
|
||||
clear_array_entry(mem, entry);
|
||||
}
|
||||
|
||||
assert(*payload == nullptr);
|
||||
@ -428,7 +428,7 @@ int gcc_handle_packet_fragment(const GC_Session *c, GC_Chat *chat, uint32_t peer
|
||||
uint64_t message_id, void *userdata)
|
||||
{
|
||||
if (length > 0) {
|
||||
if (!store_in_recv_array(chat->log, chat->mono_time, gconn, chunk, length, packet_type, message_id)) {
|
||||
if (!store_in_recv_array(chat->log, chat->mem, chat->mono_time, gconn, chunk, length, packet_type, message_id)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -442,15 +442,15 @@ int gcc_handle_packet_fragment(const GC_Session *c, GC_Chat *chat, uint32_t peer
|
||||
memcpy(sender_pk, get_enc_key(&gconn->addr.public_key), ENC_PUBLIC_KEY_SIZE);
|
||||
|
||||
uint8_t *payload = nullptr;
|
||||
const uint16_t processed_len = reassemble_packet(chat->log, gconn, &payload, message_id);
|
||||
const uint16_t processed_len = reassemble_packet(chat->log, chat->mem, gconn, &payload, message_id);
|
||||
|
||||
if (processed_len == 0) {
|
||||
free(payload);
|
||||
mem_delete(chat->mem, payload);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!handle_gc_lossless_helper(c, chat, peer_number, payload + 1, processed_len - 1, payload[0], userdata)) {
|
||||
free(payload);
|
||||
mem_delete(chat->mem, payload);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -459,19 +459,19 @@ int gcc_handle_packet_fragment(const GC_Session *c, GC_Chat *chat, uint32_t peer
|
||||
gconn = get_gc_connection(chat, peer_number);
|
||||
|
||||
if (gconn == nullptr) {
|
||||
free(payload);
|
||||
mem_delete(chat->mem, payload);
|
||||
return 0;
|
||||
}
|
||||
|
||||
gcc_set_recv_message_id(gconn, gconn->received_message_id + 1);
|
||||
gconn->last_chunk_id = 0;
|
||||
|
||||
free(payload);
|
||||
mem_delete(chat->mem, payload);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int gcc_handle_received_message(const Logger *log, const Mono_Time *mono_time, GC_Connection *gconn,
|
||||
int gcc_handle_received_message(const Logger *log, const Memory *mem, const Mono_Time *mono_time, GC_Connection *gconn,
|
||||
const uint8_t *data, uint16_t length, uint8_t packet_type, uint64_t message_id,
|
||||
bool direct_conn)
|
||||
{
|
||||
@ -490,7 +490,7 @@ int gcc_handle_received_message(const Logger *log, const Mono_Time *mono_time, G
|
||||
|
||||
/* we're missing an older message from this peer so we store it in recv_array */
|
||||
if (message_id > gconn->received_message_id + 1) {
|
||||
if (!store_in_recv_array(log, mono_time, gconn, data, length, packet_type, message_id)) {
|
||||
if (!store_in_recv_array(log, mem, mono_time, gconn, data, length, packet_type, message_id)) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -522,7 +522,7 @@ static bool process_recv_array_entry(const GC_Session *c, GC_Chat *chat, GC_Conn
|
||||
peer_number = get_peer_number_of_enc_pk(chat, sender_pk, false);
|
||||
gconn = get_gc_connection(chat, peer_number);
|
||||
|
||||
clear_array_entry(array_entry);
|
||||
clear_array_entry(chat->mem, array_entry);
|
||||
|
||||
if (gconn == nullptr) {
|
||||
return true;
|
||||
@ -621,7 +621,7 @@ int gcc_encrypt_and_send_lossless_packet(const GC_Chat *chat, const GC_Connectio
|
||||
uint16_t length, uint64_t message_id, uint8_t packet_type)
|
||||
{
|
||||
const uint16_t packet_size = gc_get_wrapped_packet_size(length, NET_PACKET_GC_LOSSLESS);
|
||||
uint8_t *packet = (uint8_t *)malloc(packet_size);
|
||||
uint8_t *packet = (uint8_t *)mem_balloc(chat->mem, packet_size);
|
||||
|
||||
if (packet == nullptr) {
|
||||
LOGGER_ERROR(chat->log, "Failed to allocate memory for packet buffer");
|
||||
@ -634,17 +634,17 @@ int gcc_encrypt_and_send_lossless_packet(const GC_Chat *chat, const GC_Connectio
|
||||
|
||||
if (enc_len < 0) {
|
||||
LOGGER_ERROR(chat->log, "Failed to wrap packet (type: 0x%02x, error: %d)", packet_type, enc_len);
|
||||
free(packet);
|
||||
mem_delete(chat->mem, packet);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!gcc_send_packet(chat, gconn, packet, (uint16_t)enc_len)) {
|
||||
LOGGER_DEBUG(chat->log, "Failed to send packet (type: 0x%02x, enc_len: %d)", packet_type, enc_len);
|
||||
free(packet);
|
||||
mem_delete(chat->mem, packet);
|
||||
return -2;
|
||||
}
|
||||
|
||||
free(packet);
|
||||
mem_delete(chat->mem, packet);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -686,15 +686,15 @@ void gcc_mark_for_deletion(GC_Connection *gconn, TCP_Connections *tcp_conn, Grou
|
||||
}
|
||||
}
|
||||
|
||||
void gcc_peer_cleanup(GC_Connection *gconn)
|
||||
void gcc_peer_cleanup(const Memory *mem, GC_Connection *gconn)
|
||||
{
|
||||
for (size_t i = 0; i < GCC_BUFFER_SIZE; ++i) {
|
||||
free(gconn->send_array[i].data);
|
||||
free(gconn->recv_array[i].data);
|
||||
mem_delete(mem, gconn->send_array[i].data);
|
||||
mem_delete(mem, gconn->recv_array[i].data);
|
||||
}
|
||||
|
||||
free(gconn->recv_array);
|
||||
free(gconn->send_array);
|
||||
mem_delete(mem, gconn->recv_array);
|
||||
mem_delete(mem, gconn->send_array);
|
||||
|
||||
crypto_memunlock(gconn->session_secret_key, sizeof(gconn->session_secret_key));
|
||||
crypto_memunlock(gconn->session_shared_key, sizeof(gconn->session_shared_key));
|
||||
@ -707,6 +707,6 @@ void gcc_cleanup(const GC_Chat *chat)
|
||||
GC_Connection *gconn = get_gc_connection(chat, i);
|
||||
assert(gconn != nullptr);
|
||||
|
||||
gcc_peer_cleanup(gconn);
|
||||
gcc_peer_cleanup(chat->mem, gconn);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user