Fixes for various memory leaks
This commit is contained in:
parent
ff4be03782
commit
e4ba343d48
5 changed files with 22 additions and 5 deletions
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue