Fixes for various memory leaks

This commit is contained in:
John Jones 2017-05-11 13:53:23 -05:00
parent ff4be03782
commit e4ba343d48
5 changed files with 22 additions and 5 deletions

View file

@ -12,6 +12,9 @@
#include "libp2p/net/multistream.h" #include "libp2p/net/multistream.h"
#include "multiaddr/multiaddr.h" #include "multiaddr/multiaddr.h"
// NOTE: this is normally set to 5 seconds, but you may want to increase this during debugging
int multistream_default_timeout = 5;
/*** /***
* An implementation of the libp2p multistream * An implementation of the libp2p multistream
*/ */
@ -147,7 +150,7 @@ struct Stream* libp2p_net_multistream_connect(const char* hostname, int port) {
session.default_stream = stream; session.default_stream = stream;
// try to receive the protocol id // try to receive the protocol id
return_result = libp2p_net_multistream_read(&session, &results, &results_size, 5); return_result = libp2p_net_multistream_read(&session, &results, &results_size, multistream_default_timeout);
if (return_result == 0 || results_size < 1) if (return_result == 0 || results_size < 1)
goto exit; goto exit;
@ -183,7 +186,7 @@ int libp2p_net_multistream_negotiate(struct Stream* stream) {
if (!libp2p_net_multistream_write(&secure_session, (unsigned char*)protocolID, strlen(protocolID))) if (!libp2p_net_multistream_write(&secure_session, (unsigned char*)protocolID, strlen(protocolID)))
goto exit; goto exit;
// expect the same back // expect the same back
libp2p_net_multistream_read(&secure_session, &results, &results_length, 5); libp2p_net_multistream_read(&secure_session, &results, &results_length, multistream_default_timeout);
if (results_length == 0) if (results_length == 0)
goto exit; goto exit;
if (strncmp((char*)results, protocolID, strlen(protocolID)) != 0) if (strncmp((char*)results, protocolID, strlen(protocolID)) != 0)
@ -226,8 +229,10 @@ struct Libp2pMessage* libp2p_net_multistream_get_message(struct Stream* stream)
void libp2p_net_multistream_stream_free(struct Stream* stream) { void libp2p_net_multistream_stream_free(struct Stream* stream) {
if (stream != NULL) { if (stream != NULL) {
if (stream->socket_descriptor != NULL) if (stream->socket_descriptor != NULL) {
close( *((int*)stream->socket_descriptor));
free(stream->socket_descriptor); free(stream->socket_descriptor);
}
if (stream->address != NULL) if (stream->address != NULL)
multiaddress_free(stream->address); multiaddress_free(stream->address);
free(stream); free(stream);

View file

@ -37,7 +37,8 @@ int socket_bind4(int s, uint32_t ip, uint16_t port)
int socket_bind4_reuse(int s, uint32_t ip, uint16_t port) int socket_bind4_reuse(int s, uint32_t ip, uint16_t port)
{ {
int opt = 1; int opt = 1;
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof opt); setsockopt(s, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
setsockopt(s, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));
return socket_bind4(s, ip, port); return socket_bind4(s, ip, port);
} }

View file

@ -149,7 +149,10 @@ int libp2p_peerstore_add_peer(struct Peerstore* peerstore, struct Libp2pPeer* pe
*/ */
struct PeerEntry* libp2p_peerstore_get_peer_entry(struct Peerstore* peerstore, const unsigned char* peer_id, size_t peer_id_size) { struct PeerEntry* libp2p_peerstore_get_peer_entry(struct Peerstore* peerstore, const unsigned char* peer_id, size_t peer_id_size) {
struct Libp2pLinkedList* current = peerstore->head_entry; struct Libp2pLinkedList* current = peerstore->head_entry;
// JMJ Debugging
int count = 0;
while(current != NULL) { while(current != NULL) {
count++;
struct Libp2pPeer* peer = ((struct PeerEntry*)current->item)->peer; struct Libp2pPeer* peer = ((struct PeerEntry*)current->item)->peer;
if (peer->id_size == peer_id_size) { if (peer->id_size == peer_id_size) {
if (memcmp(peer_id, peer->id, peer->id_size) == 0) { if (memcmp(peer_id, peer->id, peer->id_size) == 0) {

View file

@ -12,6 +12,10 @@
* protobuf and other methods for Message * protobuf and other methods for Message
*/ */
/**
* Allocate memory for a message
* @returns a new, allocated Libp2pMessage struct
*/
struct Libp2pMessage* libp2p_message_new() { struct Libp2pMessage* libp2p_message_new() {
struct Libp2pMessage* out = (struct Libp2pMessage*)malloc(sizeof(struct Libp2pMessage)); struct Libp2pMessage* out = (struct Libp2pMessage*)malloc(sizeof(struct Libp2pMessage));
if (out != NULL) { if (out != NULL) {
@ -26,6 +30,10 @@ struct Libp2pMessage* libp2p_message_new() {
return out; return out;
} }
/**
* Frees all resources related to a Libp2pMessage
* @param in the incoming message
*/
void libp2p_message_free(struct Libp2pMessage* in) { void libp2p_message_free(struct Libp2pMessage* in) {
if (in != NULL) { if (in != NULL) {
// a linked list of peer structs // a linked list of peer structs

View file

@ -311,7 +311,7 @@ int libp2p_routing_dht_handle_find_node(struct SessionContext* session, struct L
struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, message->key, message->key_size); struct Libp2pPeer* peer = libp2p_peerstore_get_peer(peerstore, message->key, message->key_size);
if (peer != NULL) { if (peer != NULL) {
message->provider_peer_head = libp2p_utils_linked_list_new(); message->provider_peer_head = libp2p_utils_linked_list_new();
message->provider_peer_head->item = peer; message->provider_peer_head->item = libp2p_peer_copy(peer);
if (!libp2p_routing_dht_protobuf_message(message, result_buffer, result_buffer_size)) { if (!libp2p_routing_dht_protobuf_message(message, result_buffer, result_buffer_size)) {
return 0; return 0;
} }