Fixed small memory leak

This commit is contained in:
John Jones 2017-07-27 14:32:42 -05:00
parent 1971e60438
commit 1e49d8f7ab
4 changed files with 44 additions and 26 deletions

View file

@ -42,6 +42,8 @@ struct SessionContext* libp2p_session_context_new() {
int libp2p_session_context_free(struct SessionContext* context) {
if (context != NULL) {
if (context->default_stream != NULL)
context->default_stream->close(context);
//TODO: Be more intelligent
free(context);
}

View file

@ -31,6 +31,8 @@ struct Stream {
/**
* Closes a stream
*
* NOTE: This is also responsible for deallocating the Stream struct
* @param stream the stream context
* @returns true(1) on success, otherwise false(0)
*/

View file

@ -20,11 +20,21 @@ int multistream_default_timeout = 5;
* An implementation of the libp2p multistream
*/
/***
* Close the Multistream interface
* NOTE: This also closes the socket
* @param stream_context a SessionContext
* @returns true(1)
*/
int libp2p_net_multistream_close(void* stream_context) {
struct SessionContext* secure_context = (struct SessionContext*)stream_context;
struct Stream* stream = secure_context->insecure_stream;
int socket_descriptor = *((int*)stream->socket_descriptor);
close(socket_descriptor);
free(stream->socket_descriptor);
if (stream->address != NULL)
multiaddress_free(stream->address);
free(stream);
return 1;
}

View file

@ -43,6 +43,36 @@ struct Libp2pPeer* libp2p_peer_new_from_multiaddress(const struct MultiAddress*
return out;
}
/***
* Free resources of a Libp2pPeer
* @param in the struct to free
*/
void libp2p_peer_free(struct Libp2pPeer* in) {
if (in != NULL) {
if (in->addr_head != NULL && in->addr_head->item != NULL) {
libp2p_logger_debug("peer", "Freeing peer %s\n", ((struct MultiAddress*)in->addr_head->item)->string);
} else {
libp2p_logger_debug("peer", "Freeing peer with no multiaddress.\n");
}
if (in->id != NULL)
free(in->id);
if (in->sessionContext != NULL) {
libp2p_session_context_free(in->sessionContext);
//libp2p_net_multistream_stream_free(in->connection);
in->sessionContext = NULL;
}
// free the memory in the linked list
struct Libp2pLinkedList* current = in->addr_head;
while (current != NULL) {
struct Libp2pLinkedList* temp = current->next;
multiaddress_free((struct MultiAddress*)current->item);
free(current);
current = temp;
}
free(in);
}
}
/**
* Attempt to connect to the peer, setting connection_type correctly
* NOTE: If successful, this will set peer->connection to the stream
@ -105,32 +135,6 @@ struct Libp2pPeer* libp2p_peer_new_from_data(const char* id, size_t id_size, con
}
*/
void libp2p_peer_free(struct Libp2pPeer* in) {
if (in != NULL) {
if (in->addr_head != NULL && in->addr_head->item != NULL) {
libp2p_logger_debug("peer", "Freeing peer %s\n", ((struct MultiAddress*)in->addr_head->item)->string);
} else {
libp2p_logger_debug("peer", "Freeing peer with no multiaddress.\n");
}
if (in->id != NULL)
free(in->id);
if (in->sessionContext != NULL) {
libp2p_session_context_free(in->sessionContext);
//libp2p_net_multistream_stream_free(in->connection);
in->sessionContext = NULL;
}
// free the memory in the linked list
struct Libp2pLinkedList* current = in->addr_head;
while (current != NULL) {
struct Libp2pLinkedList* temp = current->next;
multiaddress_free((struct MultiAddress*)current->item);
free(current);
current = temp;
}
free(in);
}
}
/**
* Make a copy of a peer
*