From 7d092c3467fbbcf3639ed2c698659c56b2509c31 Mon Sep 17 00:00:00 2001 From: irungentoo Date: Sat, 17 Aug 2013 11:16:08 -0400 Subject: [PATCH] Added dynamic memory allocation to crypto connections. Also fixed some possible bugs in Messenger.c --- core/Messenger.c | 32 ++++++++++++++++----------- core/net_crypto.c | 55 +++++++++++++++++++++++++++++++++++++++-------- 2 files changed, 66 insertions(+), 21 deletions(-) diff --git a/core/Messenger.c b/core/Messenger.c index 04e4626a..2c9e134b 100644 --- a/core/Messenger.c +++ b/core/Messenger.c @@ -42,7 +42,6 @@ int realloc_friendlist(Messenger *m, uint32_t num) if (newfriendlist == NULL) return -1; - memset(&newfriendlist[num - 1], 0, sizeof(Friend)); m->friendlist = newfriendlist; return 0; } @@ -165,6 +164,8 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length) if (realloc_friendlist(m, m->numfriends + 1) != 0) return FAERR_NOMEM; + memset(&(m->friendlist[m->numfriends]), 0, sizeof(Friend)); + uint32_t i; for (i = 0; i <= m->numfriends; ++i) { @@ -184,7 +185,9 @@ int m_addfriend(Messenger *m, uint8_t *address, uint8_t *data, uint16_t length) m->friendlist[i].receives_read_receipts = 1; /* default: YES */ memcpy(&(m->friendlist[i].friendrequest_nospam), address + crypto_box_PUBLICKEYBYTES, sizeof(uint32_t)); - ++ m->numfriends; + if (m->numfriends == i) + ++ m->numfriends; + return i; } } @@ -201,6 +204,8 @@ int m_addfriend_norequest(Messenger *m, uint8_t *client_id) if (realloc_friendlist(m, m->numfriends + 1) != 0) return FAERR_NOMEM; + memset(&(m->friendlist[m->numfriends]), 0, sizeof(Friend)); + uint32_t i; for (i = 0; i <= m->numfriends; ++i) { @@ -215,7 +220,10 @@ int m_addfriend_norequest(Messenger *m, uint8_t *client_id) m->friendlist[i].userstatus = USERSTATUS_NONE; m->friendlist[i].message_id = 0; m->friendlist[i].receives_read_receipts = 1; /* default: YES */ - ++ m->numfriends; + + if (m->numfriends == i) + ++ m->numfriends; + return i; } } @@ -244,7 +252,7 @@ int m_delfriend(Messenger *m, int friendnumber) m->numfriends = i; - if (realloc_friendlist(m, m->numfriends + 1) != 0) + if (realloc_friendlist(m, m->numfriends) != 0) return FAERR_NOMEM; return 0; @@ -851,14 +859,14 @@ void doMessenger(Messenger *m) uint32_t Messenger_size(Messenger *m) { return crypto_box_PUBLICKEYBYTES + crypto_box_SECRETKEYBYTES - + sizeof(uint32_t) // nospam - + sizeof(uint32_t) // DHT size - + DHT_size() // DHT itself - + sizeof(uint32_t) // Friendlist size - + sizeof(Friend) * m->numfriends // Friendlist itself - + sizeof(uint16_t) // Own nickname length - + m->name_length // Own nickname - ; + + sizeof(uint32_t) // nospam + + sizeof(uint32_t) // DHT size + + DHT_size() // DHT itself + + sizeof(uint32_t) // Friendlist size + + sizeof(Friend) * m->numfriends // Friendlist itself + + sizeof(uint16_t) // Own nickname length + + m->name_length // Own nickname + ; } /* save the messenger in data of size Messenger_size() */ diff --git a/core/net_crypto.c b/core/net_crypto.c index 4b7fa043..2dbe12ad 100644 --- a/core/net_crypto.c +++ b/core/net_crypto.c @@ -45,9 +45,11 @@ typedef struct { } Crypto_Connection; -#define MAX_CRYPTO_CONNECTIONS 256 +static Crypto_Connection *crypto_connections; -static Crypto_Connection crypto_connections[MAX_CRYPTO_CONNECTIONS]; +static uint32_t crypto_connections_length; /* Length of connections array */ + +#define MAX_CRYPTO_CONNECTIONS crypto_connections_length #define CONN_NO_CONNECTION 0 #define CONN_HANDSHAKE_SENT 1 @@ -400,6 +402,19 @@ static int getcryptconnection_id(uint8_t *public_key) return -1; } +/* set the size of the friend list to numfriends + return -1 if realloc fails */ +int realloc_cryptoconnection(uint32_t num) +{ + Crypto_Connection *newcrypto_connections = realloc(crypto_connections, num * sizeof(Crypto_Connection)); + + if (newcrypto_connections == NULL) + return -1; + + crypto_connections = newcrypto_connections; + return 0; +} + /* Start a secure connection with other peer who has public_key and ip_port returns -1 if failure returns crypt_connection_id of the initialized connection if everything went well. */ @@ -415,7 +430,13 @@ int crypto_connect(uint8_t *public_key, IP_Port ip_port) return -1; } - for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { + if (realloc_cryptoconnection(crypto_connections_length + 1) == -1) + return -1; + + memset(&crypto_connections[crypto_connections_length], 0, sizeof(Crypto_Connection)); + crypto_connections[crypto_connections_length].number = ~0; + + for (i = 0; i <= MAX_CRYPTO_CONNECTIONS; ++i) { if (crypto_connections[i].status == CONN_NO_CONNECTION) { int id = new_connection(ip_port); @@ -428,6 +449,9 @@ int crypto_connect(uint8_t *public_key, IP_Port ip_port) memcpy(crypto_connections[i].public_key, public_key, crypto_box_PUBLICKEYBYTES); crypto_box_keypair(crypto_connections[i].sessionpublic_key, crypto_connections[i].sessionsecret_key); + if (crypto_connections_length == i) + ++crypto_connections_length; + if (send_cryptohandshake(id, public_key, crypto_connections[i].recv_nonce, crypto_connections[i].sessionpublic_key) == 1) { increment_nonce(crypto_connections[i].recv_nonce); @@ -489,6 +513,15 @@ int crypto_kill(int crypt_connection_id) kill_connection(crypto_connections[crypt_connection_id].number); memset(&crypto_connections[crypt_connection_id], 0 , sizeof(Crypto_Connection)); crypto_connections[crypt_connection_id].number = ~0; + uint32_t i; + + for (i = crypto_connections_length; i != 0; --i) { + if (crypto_connections[i - 1].status != CONN_NO_CONNECTION) + break; + } + + crypto_connections_length = i; + realloc_cryptoconnection(crypto_connections_length); return 0; } @@ -510,7 +543,13 @@ int accept_crypto_inbound(int connection_id, uint8_t *public_key, uint8_t *secre { return -1; }*/ - for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) { + if (realloc_cryptoconnection(crypto_connections_length + 1) == -1) + return -1; + + memset(&crypto_connections[crypto_connections_length], 0, sizeof(Crypto_Connection)); + crypto_connections[crypto_connections_length].number = ~0; + + for (i = 0; i <= MAX_CRYPTO_CONNECTIONS; ++i) { if (crypto_connections[i].status == CONN_NO_CONNECTION) { crypto_connections[i].number = connection_id; crypto_connections[i].status = CONN_NOT_CONFIRMED; @@ -522,6 +561,9 @@ int accept_crypto_inbound(int connection_id, uint8_t *public_key, uint8_t *secre crypto_box_keypair(crypto_connections[i].sessionpublic_key, crypto_connections[i].sessionsecret_key); + if (crypto_connections_length == i) + ++crypto_connections_length; + if (send_cryptohandshake(connection_id, public_key, crypto_connections[i].recv_nonce, crypto_connections[i].sessionpublic_key) == 1) { increment_nonce(crypto_connections[i].recv_nonce); @@ -680,13 +722,8 @@ static void receive_crypto(void) sets all the global connection variables to their default values. */ void initNetCrypto(void) { - memset(crypto_connections, 0 , sizeof(crypto_connections)); memset(incoming_connections, -1 , sizeof(incoming_connections)); networking_registerhandler(32, &cryptopacket_handle); - uint32_t i; - - for (i = 0; i < MAX_CRYPTO_CONNECTIONS; ++i) - crypto_connections[i].number = ~0; } static void killTimedout(void)