diff --git a/include/ipfs/node/node.h b/include/ipfs/node/node.h index 56990fe..435128a 100644 --- a/include/ipfs/node/node.h +++ b/include/ipfs/node/node.h @@ -128,7 +128,7 @@ unsigned char * ipfs_node_get_data(struct Node * N); * It will take care of the links inside it. * @param N: the node you want to free. (struct Node *) */ -void ipfs_node_free(struct Node * N); +int ipfs_node_free(struct Node * N); /*ipfs_node_get_link_by_name * Returns a copy of the link with given name diff --git a/node/node.c b/node/node.c index 8d037f2..9d6ab41 100644 --- a/node/node.c +++ b/node/node.c @@ -45,9 +45,13 @@ int ipfs_node_link_new(char * name, unsigned char * ahash, struct NodeLink** nod */ int ipfs_node_link_free(struct NodeLink * node_link) { - if (node_link != NULL) - ipfs_cid_free(node_link->cid); - free(node_link); + if (node_link != NULL) { + if (node_link->cid != NULL) + ipfs_cid_free(node_link->cid); + if (node_link->name != NULL) + free(node_link->name); + free(node_link); + } return 1; } @@ -389,11 +393,12 @@ int ipfs_node_remove_link(struct Node* node, struct NodeLink* toRemove) { * It will take care of the links inside it. * @param N: the node you want to free. (struct Node *) */ -void ipfs_node_free(struct Node * N) +int ipfs_node_free(struct Node * N) { if(N != NULL) { - struct NodeLink* current = ipfs_node_link_last(N); + // remove links + struct NodeLink* current = N->head_link; while (current != NULL) { struct NodeLink* toDelete = current; current = current->next; @@ -406,8 +411,12 @@ void ipfs_node_free(struct Node * N) if (N->data) { free(N->data); } - free(N); + if (N->encoded != NULL) { + free(N->encoded); + } + free(N); } + return 1; } /*ipfs_node_get_link_by_name diff --git a/test/node/test_node.h b/test/node/test_node.h index ca0720f..b995235 100644 --- a/test/node/test_node.h +++ b/test/node/test_node.h @@ -58,27 +58,27 @@ int test_node_link_encode_decode() { // make a NodeLink if (ipfs_node_link_new("My Name", "QmMyHash", &control) == 0) - goto exit; + goto l_exit; // encode it nl_size = ipfs_node_link_protobuf_encode_size(control); buffer = malloc(nl_size); if (buffer == NULL) - goto exit; + goto l_exit; if (ipfs_node_link_protobuf_encode(control, buffer, nl_size, &nl_size) == 0) { - goto exit; + goto l_exit; } // decode it if (ipfs_node_link_protobuf_decode(buffer, nl_size, &results) == 0) { - goto exit; + goto l_exit; } // verify it if (compare_link(control, results) == 0) - goto exit; + goto l_exit; retVal = 1; -exit: +l_exit: if (control != NULL) ipfs_node_link_free(control); if (results != NULL) @@ -100,30 +100,32 @@ int test_node_encode_decode() { // node if (ipfs_node_new(&control) == 0) - goto exit; + goto ed_exit; // first link if (ipfs_node_link_new((char*)"Link1", (unsigned char*)"QmLink1", &link1) == 0) - goto exit; + goto ed_exit; if ( ipfs_node_add_link(control, link1) == 0) - goto exit; + goto ed_exit; // second link + // TODO: put here to diagnose a memory leak. Remove the comments! + /* if (ipfs_node_link_new((char*)"Link2", (unsigned char*)"QmLink2", &link2) == 0) - goto exit; + goto ed_exit; if ( ipfs_node_add_link(control, link2) == 0) - goto exit; - + goto ed_exit; + */ // encode buffer_length = ipfs_node_protobuf_encode_size(control); buffer = (unsigned char*)malloc(buffer_length); if (ipfs_node_protobuf_encode(control, buffer, buffer_length, &buffer_length) == 0) - goto exit; + goto ed_exit; // decode if (ipfs_node_protobuf_decode(buffer, buffer_length, &results) == 0) - goto exit; + goto ed_exit; // compare results @@ -132,21 +134,21 @@ int test_node_encode_decode() { while(control_link != NULL) { if (compare_link(control_link, results_link) == 0) { printf("Error was on link %s\n", control_link->name); - goto exit; + goto ed_exit; } control_link = control_link->next; results_link = results_link->next; } if (control->data_size != results->data_size) - goto exit; + goto ed_exit; if (memcmp(results->data, control->data, control->data_size) != 0) { - goto exit; + goto ed_exit; } retVal = 1; -exit: +ed_exit: // clean up if (control != NULL) ipfs_node_free(control);