From 3004f1411a121c9e7a085e6945a6de93c452a8b4 Mon Sep 17 00:00:00 2001 From: John Jones Date: Fri, 23 Dec 2016 19:08:41 -0500 Subject: [PATCH] More memory fixes --- importer/importer.c | 6 ++--- merkledag/node.c | 4 +-- unixfs/unixfs.c | 60 +++++++++++++++++++++++++++++++++++---------- 3 files changed, 52 insertions(+), 18 deletions(-) diff --git a/importer/importer.c b/importer/importer.c index a63778e..89770f6 100644 --- a/importer/importer.c +++ b/importer/importer.c @@ -45,11 +45,11 @@ int ipfs_importer_add_filesize_to_data_section(struct Node* node, size_t bytes_r int test_hash(unsigned char* protobuf, size_t protobuf_length) { size_t hash_size = 32; - unsigned char* hash = (unsigned char*)malloc(hash_size); + unsigned char hash[32]; if (hash == NULL) { return 0; } - if (libp2p_crypto_hashing_sha256(protobuf, protobuf_length, hash) == 0) { + if (libp2p_crypto_hashing_sha256(protobuf, protobuf_length, &hash[0]) == 0) { return 0; } @@ -107,7 +107,7 @@ size_t ipfs_import_chunk(FILE* file, struct Node* parent_node, struct FSRepo* fs } //JMJ printf("unixfs protobuf"); - test_hash(protobuf, protobuf_size); + test_hash(protobuf, bytes_written); // we're done with the UnixFS object ipfs_unixfs_free(new_unixfs); diff --git a/merkledag/node.c b/merkledag/node.c index ebff28a..cca0c24 100644 --- a/merkledag/node.c +++ b/merkledag/node.c @@ -183,10 +183,10 @@ int ipfs_node_link_protobuf_decode(unsigned char* buffer, size_t buffer_length, unsigned char* hash; if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&hash, &hash_size, &bytes_read) == 0) goto exit; - link->hash = (unsigned char*)malloc(hash_size - 2); link->hash_size = hash_size - 2; + link->hash = (unsigned char*)malloc(link->hash_size); strncpy((char*)link->hash, (char*)hash, link->hash_size); - link->hash[hash_size-1] = 0; + link->hash[link->hash_size-1] = 0; free(hash); pos += bytes_read; break; diff --git a/unixfs/unixfs.c b/unixfs/unixfs.c index 8231b84..7eb4d76 100644 --- a/unixfs/unixfs.c +++ b/unixfs/unixfs.c @@ -52,6 +52,40 @@ int ipfs_unixfs_new(struct UnixFS** obj) { return 1; } +struct UnixFSBlockSizeNode* ipfs_unixfs_get_last_block_size(struct UnixFS* obj) { + struct UnixFSBlockSizeNode* current = obj->block_size_head; + if (current != NULL) { + while (current->next != NULL) + current = current->next; + } + return current; +} + +int ipfs_unixfs_remove_blocksize(struct UnixFS* obj, struct UnixFSBlockSizeNode* to_delete) { + struct UnixFSBlockSizeNode* current = obj->block_size_head; + struct UnixFSBlockSizeNode* previous = NULL; + while (current != NULL && current != to_delete) { + previous = current; + current = current->next; + } + if (previous == NULL) { + free(obj->block_size_head); + obj->block_size_head = NULL; + } else { + struct UnixFSBlockSizeNode* holder = NULL; + if (current != NULL && current->next != NULL) { + // we need to delete from the middle + holder = current->next; + } + free(previous->next); + if (holder == NULL) + previous->next = NULL; + else + previous->next = holder; + } + return 1; +} + int ipfs_unixfs_free(struct UnixFS* obj) { if (obj != NULL) { if (obj->hash != NULL) { @@ -60,6 +94,13 @@ int ipfs_unixfs_free(struct UnixFS* obj) { if (obj->bytes != NULL) { free(obj->bytes); } + if (obj->block_size_head != NULL) { + struct UnixFSBlockSizeNode* current = ipfs_unixfs_get_last_block_size(obj); + while(current != NULL) { + ipfs_unixfs_remove_blocksize(obj, current); + current = ipfs_unixfs_get_last_block_size(obj); + } + } free(obj); obj = NULL; } @@ -106,6 +147,7 @@ int ipfs_unixfs_add_blocksize(const struct UnixFSBlockSizeNode* blocksize, struc // we're the first one unix_fs->block_size_head = (struct UnixFSBlockSizeNode*)malloc(sizeof(struct UnixFSBlockSizeNode)); unix_fs->block_size_head->block_size = blocksize->block_size; + unix_fs->block_size_head->next = NULL; } else { // find the last one while (last->next != NULL) { @@ -113,6 +155,7 @@ int ipfs_unixfs_add_blocksize(const struct UnixFSBlockSizeNode* blocksize, struc } last->next = (struct UnixFSBlockSizeNode*)malloc(sizeof(struct UnixFSBlockSizeNode)); last->next->block_size = blocksize->block_size; + last->next->next = NULL; } @@ -237,20 +280,11 @@ int ipfs_unixfs_protobuf_decode(unsigned char* incoming, size_t incoming_size, s pos += bytes_read; break; case (4): { // block sizes (linked list from varint) - struct UnixFSBlockSizeNode* currNode = (struct UnixFSBlockSizeNode*)malloc(sizeof(struct UnixFSBlockSizeNode)); - if (currNode == NULL) - return 0; - currNode->next = NULL; - currNode->block_size = varint_decode(&incoming[pos], incoming_size - pos, &bytes_read); + struct UnixFSBlockSizeNode bs; + bs.next = NULL; + bs.block_size = varint_decode(&incoming[pos], incoming_size - pos, &bytes_read); + ipfs_unixfs_add_blocksize(&bs, result); pos += bytes_read; - if (result->block_size_head == NULL) { - result->block_size_head = currNode; - } else { - struct UnixFSBlockSizeNode* last = result->block_size_head; - while (last->next != NULL) - last = last->next; - last->next = currNode; - } break; } }