Skip to content

Commit

Permalink
ensure save data unchanged after save and load
Browse files Browse the repository at this point in the history
  • Loading branch information
zugz committed Sep 28, 2018
1 parent 40d88e3 commit 9038ec4
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 11 deletions.
10 changes: 10 additions & 0 deletions toxcore/DHT.c
Original file line number Diff line number Diff line change
Expand Up @@ -2803,6 +2803,11 @@ uint32_t dht_size(const DHT *dht)
uint32_t numv4 = 0;
uint32_t numv6 = 0;

for (uint32_t i = 0; i < dht->loaded_num_nodes; ++i) {
numv4 += (net_family_is_ipv4(dht->loaded_nodes_list[i].ip_port.ip.family));
numv6 += (net_family_is_ipv6(dht->loaded_nodes_list[i].ip_port.ip.family));
}

for (uint32_t i = 0; i < LCLIENT_LIST; ++i) {
numv4 += (dht->close_clientlist[i].assoc4.timestamp != 0);
numv6 += (dht->close_clientlist[i].assoc6.timestamp != 0);
Expand Down Expand Up @@ -2838,6 +2843,11 @@ void dht_save(const DHT *dht, uint8_t *data)

uint32_t num = 0;

if (dht->loaded_num_nodes > 0) {
memcpy(clients, dht->loaded_nodes_list, sizeof(Node_format) * dht->loaded_num_nodes);
num += dht->loaded_num_nodes;
}

for (uint32_t i = 0; i < LCLIENT_LIST; ++i) {
if (dht->close_clientlist[i].assoc4.timestamp != 0) {
memcpy(clients[num].public_key, dht->close_clientlist[i].public_key, CRYPTO_PUBLIC_KEY_SIZE);
Expand Down
6 changes: 6 additions & 0 deletions toxcore/Messenger.c
Original file line number Diff line number Diff line change
Expand Up @@ -3019,6 +3019,7 @@ static uint8_t *friends_list_save(const Messenger *m, uint8_t *data)
temp.info_size = net_htons(m->friendlist[i].info_size);
temp.friendrequest_nospam = m->friendlist[i].friendrequest_nospam;
} else {
temp.status = 3;
memcpy(temp.name, m->friendlist[i].name, m->friendlist[i].name_length);
temp.name_length = net_htons(m->friendlist[i].name_length);
memcpy(temp.statusmessage, m->friendlist[i].statusmessage, m->friendlist[i].statusmessage_length);
Expand Down Expand Up @@ -3178,6 +3179,11 @@ static uint8_t *save_tcp_relays(const Messenger *m, uint8_t *data)
uint8_t *temp_data = data;
data = state_write_section_header(temp_data, TOP_STATE_COOKIE_TYPE, 0, TOP_STATE_TYPE_TCP_RELAY);
unsigned int num = copy_connected_tcp_relays(m->net_crypto, relays, NUM_SAVED_TCP_RELAYS);

if (!m->has_added_relays) {
memcpy(relays, m->loaded_relays, sizeof(Node_format) * (NUM_SAVED_TCP_RELAYS - num));
}

int l = pack_nodes(data, NUM_SAVED_TCP_RELAYS * packed_node_size(net_family_tcp_ipv6), relays, num);

if (l > 0) {
Expand Down
30 changes: 19 additions & 11 deletions toxcore/onion_client.c
Original file line number Diff line number Diff line change
Expand Up @@ -232,27 +232,35 @@ static int onion_add_path_node(Onion_Client *onion_c, IP_Port ip_port, const uin
*/
uint16_t onion_backup_nodes(const Onion_Client *onion_c, Node_format *nodes, uint16_t max_num)
{
unsigned int i;

if (!max_num) {
return 0;
}

unsigned int num_nodes = (onion_c->path_nodes_index < MAX_PATH_NODES) ? onion_c->path_nodes_index : MAX_PATH_NODES;
const uint16_t num_nodes = (onion_c->path_nodes_index < MAX_PATH_NODES) ? onion_c->path_nodes_index : MAX_PATH_NODES;
uint16_t i = 0;

if (num_nodes == 0) {
return 0;
while (i < max_num && i < num_nodes) {
nodes[i] = onion_c->path_nodes[(onion_c->path_nodes_index - (1 + i)) % num_nodes];
++i;
}

if (num_nodes < max_num) {
max_num = num_nodes;
}
for (uint16_t j = 0; i < max_num && j < MAX_PATH_NODES && j < onion_c->path_nodes_index_bs; ++j) {
bool already_saved = false;

for (i = 0; i < max_num; ++i) {
nodes[i] = onion_c->path_nodes[(onion_c->path_nodes_index - (1 + i)) % num_nodes];
for (uint16_t k = 0; k < num_nodes; ++k) {
if (public_key_cmp(nodes[k].public_key, onion_c->path_nodes_bs[j].public_key) == 0) {
already_saved = true;
break;
}
}

if (!already_saved) {
nodes[i] = onion_c->path_nodes_bs[j];
++i;
}
}

return max_num;
return i;
}

/* Put up to max_num random nodes in nodes.
Expand Down

0 comments on commit 9038ec4

Please sign in to comment.