summaryrefslogtreecommitdiff
path: root/toxcore/Messenger.c
diff options
context:
space:
mode:
authorirungentoo <irungentoo@gmail.com>2015-07-17 22:51:14 -0400
committerirungentoo <irungentoo@gmail.com>2015-07-17 22:51:14 -0400
commitdb88dc7b4525b4ea2eb11f4c4df85bf132cd0c74 (patch)
treea7816a824aeeaed48b407db68e55b9b6779cac1c /toxcore/Messenger.c
parent6ecf2941ac71e36d6978539b0dd24b7ad1ecf8f1 (diff)
Allow savedata to be slightly smaller than the allocated buffer.
Diffstat (limited to 'toxcore/Messenger.c')
-rw-r--r--toxcore/Messenger.c27
1 files changed, 23 insertions, 4 deletions
diff --git a/toxcore/Messenger.c b/toxcore/Messenger.c
index 2240ff5c..b2592c26 100644
--- a/toxcore/Messenger.c
+++ b/toxcore/Messenger.c
@@ -2430,6 +2430,7 @@ void do_messenger(Messenger *m)
2430#define MESSENGER_STATE_TYPE_STATUS 6 2430#define MESSENGER_STATE_TYPE_STATUS 6
2431#define MESSENGER_STATE_TYPE_TCP_RELAY 10 2431#define MESSENGER_STATE_TYPE_TCP_RELAY 10
2432#define MESSENGER_STATE_TYPE_PATH_NODE 11 2432#define MESSENGER_STATE_TYPE_PATH_NODE 11
2433#define MESSENGER_STATE_TYPE_END 255
2433 2434
2434#define SAVED_FRIEND_REQUEST_SIZE 1024 2435#define SAVED_FRIEND_REQUEST_SIZE 1024
2435#define NUM_SAVED_PATH_NODES 8 2436#define NUM_SAVED_PATH_NODES 8
@@ -2547,7 +2548,7 @@ uint32_t messenger_size(const Messenger *m)
2547 + sizesubhead + 1 // status 2548 + sizesubhead + 1 // status
2548 + sizesubhead + NUM_SAVED_TCP_RELAYS * packed_node_size(TCP_INET6) //TCP relays 2549 + sizesubhead + NUM_SAVED_TCP_RELAYS * packed_node_size(TCP_INET6) //TCP relays
2549 + sizesubhead + NUM_SAVED_PATH_NODES * sizeof(Node_format) //saved path nodes 2550 + sizesubhead + NUM_SAVED_PATH_NODES * sizeof(Node_format) //saved path nodes
2550 ; 2551 + sizesubhead;
2551} 2552}
2552 2553
2553static uint8_t *z_state_save_subheader(uint8_t *data, uint32_t len, uint16_t type) 2554static uint8_t *z_state_save_subheader(uint8_t *data, uint32_t len, uint16_t type)
@@ -2562,6 +2563,8 @@ static uint8_t *z_state_save_subheader(uint8_t *data, uint32_t len, uint16_t typ
2562/* Save the messenger in data of size Messenger_size(). */ 2563/* Save the messenger in data of size Messenger_size(). */
2563void messenger_save(const Messenger *m, uint8_t *data) 2564void messenger_save(const Messenger *m, uint8_t *data)
2564{ 2565{
2566 memset(data, 0, messenger_size(m));
2567
2565 uint32_t len; 2568 uint32_t len;
2566 uint16_t type; 2569 uint16_t type;
2567 uint32_t *data32, size32 = sizeof(uint32_t); 2570 uint32_t *data32, size32 = sizeof(uint32_t);
@@ -2616,9 +2619,13 @@ void messenger_save(const Messenger *m, uint8_t *data)
2616 uint8_t *temp_data = data; 2619 uint8_t *temp_data = data;
2617 data = z_state_save_subheader(temp_data, 0, type); 2620 data = z_state_save_subheader(temp_data, 0, type);
2618 unsigned int num = copy_connected_tcp_relays(m->net_crypto, relays, NUM_SAVED_TCP_RELAYS); 2621 unsigned int num = copy_connected_tcp_relays(m->net_crypto, relays, NUM_SAVED_TCP_RELAYS);
2619 len = pack_nodes(data, NUM_SAVED_TCP_RELAYS * packed_node_size(TCP_INET6), relays, num); 2622 int l = pack_nodes(data, NUM_SAVED_TCP_RELAYS * packed_node_size(TCP_INET6), relays, num);
2620 data = z_state_save_subheader(temp_data, len, type); 2623
2621 data += len; 2624 if (l > 0) {
2625 len = l;
2626 data = z_state_save_subheader(temp_data, len, type);
2627 data += len;
2628 }
2622 2629
2623 Node_format nodes[NUM_SAVED_PATH_NODES]; 2630 Node_format nodes[NUM_SAVED_PATH_NODES];
2624 len = sizeof(nodes); 2631 len = sizeof(nodes);
@@ -2627,6 +2634,9 @@ void messenger_save(const Messenger *m, uint8_t *data)
2627 memset(nodes, 0, len); 2634 memset(nodes, 0, len);
2628 onion_backup_nodes(m->onion_c, nodes, NUM_SAVED_PATH_NODES); 2635 onion_backup_nodes(m->onion_c, nodes, NUM_SAVED_PATH_NODES);
2629 memcpy(data, nodes, len); 2636 memcpy(data, nodes, len);
2637 data += len;
2638
2639 z_state_save_subheader(data, 0, MESSENGER_STATE_TYPE_END);
2630} 2640}
2631 2641
2632static int messenger_load_state_callback(void *outer, const uint8_t *data, uint32_t length, uint16_t type) 2642static int messenger_load_state_callback(void *outer, const uint8_t *data, uint32_t length, uint16_t type)
@@ -2704,6 +2714,15 @@ static int messenger_load_state_callback(void *outer, const uint8_t *data, uint3
2704 break; 2714 break;
2705 } 2715 }
2706 2716
2717 case MESSENGER_STATE_TYPE_END: {
2718 if (length != 0) {
2719 return -1;
2720 }
2721
2722 return -2;
2723 break;
2724 }
2725
2707#ifdef DEBUG 2726#ifdef DEBUG
2708 2727
2709 default: 2728 default: