Chasing memory leak possibly in PeerStore

This commit is contained in:
John Jones 2017-07-31 14:51:29 -05:00
parent a137c2c43e
commit 5406fb29e2
2 changed files with 40 additions and 17 deletions

View file

@ -4,6 +4,10 @@
#include "libp2p/peer/peerstore.h" #include "libp2p/peer/peerstore.h"
#include "libp2p/utils/logger.h" #include "libp2p/utils/logger.h"
/***
* Creates a new PeerEntry struct
* @returns the newly allocated struct or NULL
*/
struct PeerEntry* libp2p_peer_entry_new() { struct PeerEntry* libp2p_peer_entry_new() {
struct PeerEntry* out = (struct PeerEntry*)malloc(sizeof(struct PeerEntry)); struct PeerEntry* out = (struct PeerEntry*)malloc(sizeof(struct PeerEntry));
if (out != NULL) { if (out != NULL) {
@ -12,6 +16,10 @@ struct PeerEntry* libp2p_peer_entry_new() {
return out; return out;
} }
/***
* Frees resources
* @param in the PeerEntry to free
*/
void libp2p_peer_entry_free(struct PeerEntry* in) { void libp2p_peer_entry_free(struct PeerEntry* in) {
if (in != NULL) { if (in != NULL) {
libp2p_peer_free(in->peer); libp2p_peer_free(in->peer);
@ -19,6 +27,11 @@ void libp2p_peer_entry_free(struct PeerEntry* in) {
} }
} }
/***
* Copies a PeerEntry
* @param in the PeerEntry to copy
* @returns a newly allocated PeerEntry with the values from "in"
*/
struct PeerEntry* libp2p_peer_entry_copy(struct PeerEntry* in) { struct PeerEntry* libp2p_peer_entry_copy(struct PeerEntry* in) {
struct PeerEntry* out = libp2p_peer_entry_new(); struct PeerEntry* out = libp2p_peer_entry_new();
if (out != NULL) { if (out != NULL) {
@ -60,9 +73,9 @@ int libp2p_peerstore_free(struct Peerstore* in) {
next = current->next; next = current->next;
libp2p_peer_entry_free((struct PeerEntry*)current->item); libp2p_peer_entry_free((struct PeerEntry*)current->item);
current->item = NULL; current->item = NULL;
libp2p_utils_linked_list_free(current);
current = next; current = next;
} }
libp2p_utils_linked_list_free(in->head_entry);
free(in); free(in);
} }
return 1; return 1;
@ -75,14 +88,14 @@ int libp2p_peerstore_free(struct Peerstore* in) {
* @returns true(1) on success, otherwise false * @returns true(1) on success, otherwise false
*/ */
int libp2p_peerstore_add_peer_entry(struct Peerstore* peerstore, struct PeerEntry* peer_entry) { int libp2p_peerstore_add_peer_entry(struct Peerstore* peerstore, struct PeerEntry* peer_entry) {
if (peer_entry == NULL)
return 0;
struct Libp2pLinkedList* new_item = libp2p_utils_linked_list_new(); struct Libp2pLinkedList* new_item = libp2p_utils_linked_list_new();
if (new_item == NULL) if (new_item == NULL)
return 0; return 0;
new_item->item = libp2p_peer_entry_copy(peer_entry);
if (new_item->item == NULL) { new_item->item = peer_entry;
libp2p_utils_linked_list_free(new_item);
return 0;
}
if (peerstore->head_entry == NULL) { if (peerstore->head_entry == NULL) {
peerstore->head_entry = new_item; peerstore->head_entry = new_item;
peerstore->last_entry = new_item; peerstore->last_entry = new_item;
@ -113,12 +126,9 @@ int libp2p_peerstore_add_peer(struct Peerstore* peerstore, const struct Libp2pPe
} }
if (peer->id_size > 0) { if (peer->id_size > 0) {
char peer_id[peer->id_size + 1];
memcpy(peer_id, peer->id, peer->id_size);
peer_id[peer->id_size] = 0;
if (peer->addr_head != NULL) { if (peer->addr_head != NULL) {
char* address = ((struct MultiAddress*)peer->addr_head->item)->string; char* address = ((struct MultiAddress*)peer->addr_head->item)->string;
libp2p_logger_debug("peerstore", "Adding peer %s with address %s to peer store\n", peer_id, address); libp2p_logger_debug("peerstore", "Adding peer %s with address %s to peer store\n", peer->id, address);
} }
struct PeerEntry* peer_entry = libp2p_peer_entry_new(); struct PeerEntry* peer_entry = libp2p_peer_entry_new();
if (peer_entry == NULL) { if (peer_entry == NULL) {
@ -128,8 +138,7 @@ int libp2p_peerstore_add_peer(struct Peerstore* peerstore, const struct Libp2pPe
if (peer_entry->peer == NULL) if (peer_entry->peer == NULL)
return 0; return 0;
retVal = libp2p_peerstore_add_peer_entry(peerstore, peer_entry); retVal = libp2p_peerstore_add_peer_entry(peerstore, peer_entry);
libp2p_peer_entry_free(peer_entry); libp2p_logger_debug("peerstore", "Adding peer %s to peerstore was a success\n", peer->id);
libp2p_logger_debug("peerstore", "Adding peer %s to peerstore was a success\n", peer_id);
} }
return retVal; return retVal;
} }

View file

@ -24,9 +24,14 @@ int test_peer() {
* Test the peerstore * Test the peerstore
*/ */
int test_peerstore() { int test_peerstore() {
// create a Peer
struct Libp2pPeer* peer = libp2p_peer_new(); struct Libp2pPeer* peer = libp2p_peer_new();
peer->id = "Qmabcdefg"; peer->id = malloc(10);
strcpy(peer->id, "Qmabcdefg");
peer->id_size = strlen(peer->id); peer->id_size = strlen(peer->id);
// create a PeerStore
struct Peerstore* peerstore = libp2p_peerstore_new(peer); struct Peerstore* peerstore = libp2p_peerstore_new(peer);
struct PeerEntry* peer_entry = NULL; struct PeerEntry* peer_entry = NULL;
struct PeerEntry* results = NULL; struct PeerEntry* results = NULL;
@ -36,21 +41,32 @@ int test_peerstore() {
goto exit; goto exit;
// add a peer entry to the peerstore // add a peer entry to the peerstore
/*
peer_entry = libp2p_peer_entry_new(); peer_entry = libp2p_peer_entry_new();
peer_entry->peer = libp2p_peer_new(); peer_entry->peer = libp2p_peer_new();
peer_entry->peer->id_size = 6; peer_entry->peer->id_size = 6;
peer_entry->peer->id = malloc(peer_entry->peer->id_size); peer_entry->peer->id = malloc(peer_entry->peer->id_size);
memcpy(peer_entry->peer->id, "ABC123", peer_entry->peer->id_size); memcpy(peer_entry->peer->id, "ABC123", peer_entry->peer->id_size);
peer_entry->peer->connection_type = CONNECTION_TYPE_NOT_CONNECTED; peer_entry->peer->connection_type = CONNECTION_TYPE_NOT_CONNECTED;
*/
if (!libp2p_peerstore_add_peer(peerstore, peer)) {
fprintf(stderr, "libp2p_peerstore_add_peer returned false\n");
goto exit;
}
/*
if (!libp2p_peerstore_add_peer_entry(peerstore, peer_entry)) if (!libp2p_peerstore_add_peer_entry(peerstore, peer_entry))
goto exit; goto exit;
*/
// now try to retrieve it // now try to retrieve it
results = libp2p_peerstore_get_peer_entry(peerstore, (unsigned char*)"ABC123", 6); results = libp2p_peerstore_get_peer_entry(peerstore, (unsigned char*)"Qmabcdefg", 9);
if (results == NULL || results->peer->id_size != 6) if (results == NULL || results->peer->id_size != 9) {
fprintf(stderr, "libp2p_peerstore_get_peer_entry returned NULL or was the wrong size\n");
goto exit; goto exit;
}
// cleanup // cleanup
retVal = 1; retVal = 1;
@ -58,8 +74,6 @@ int test_peerstore() {
exit: exit:
if (peerstore != NULL) if (peerstore != NULL)
libp2p_peerstore_free(peerstore); libp2p_peerstore_free(peerstore);
if (peer_entry != NULL)
libp2p_peer_entry_free(peer_entry);
if (peer != NULL) if (peer != NULL)
libp2p_peer_free(peer); libp2p_peer_free(peer);
return retVal; return retVal;