diff options
author | irungentoo <irungentoo@gmail.com> | 2015-07-17 22:51:14 -0400 |
---|---|---|
committer | irungentoo <irungentoo@gmail.com> | 2015-07-17 22:51:14 -0400 |
commit | db88dc7b4525b4ea2eb11f4c4df85bf132cd0c74 (patch) | |
tree | a7816a824aeeaed48b407db68e55b9b6779cac1c /toxcore/Messenger.c | |
parent | 6ecf2941ac71e36d6978539b0dd24b7ad1ecf8f1 (diff) |
Allow savedata to be slightly smaller than the allocated buffer.
Diffstat (limited to 'toxcore/Messenger.c')
-rw-r--r-- | toxcore/Messenger.c | 27 |
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 | ||
2553 | static uint8_t *z_state_save_subheader(uint8_t *data, uint32_t len, uint16_t type) | 2554 | static 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(). */ |
2563 | void messenger_save(const Messenger *m, uint8_t *data) | 2564 | void 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 | ||
2632 | static int messenger_load_state_callback(void *outer, const uint8_t *data, uint32_t length, uint16_t type) | 2642 | static 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: |