More memory fixes

This commit is contained in:
John Jones 2016-12-23 19:08:41 -05:00
parent 1dcbf8962e
commit 3004f1411a
3 changed files with 52 additions and 18 deletions

View file

@ -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) { int test_hash(unsigned char* protobuf, size_t protobuf_length) {
size_t hash_size = 32; size_t hash_size = 32;
unsigned char* hash = (unsigned char*)malloc(hash_size); unsigned char hash[32];
if (hash == NULL) { if (hash == NULL) {
return 0; 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; return 0;
} }
@ -107,7 +107,7 @@ size_t ipfs_import_chunk(FILE* file, struct Node* parent_node, struct FSRepo* fs
} }
//JMJ //JMJ
printf("unixfs protobuf"); printf("unixfs protobuf");
test_hash(protobuf, protobuf_size); test_hash(protobuf, bytes_written);
// we're done with the UnixFS object // we're done with the UnixFS object
ipfs_unixfs_free(new_unixfs); ipfs_unixfs_free(new_unixfs);

View file

@ -183,10 +183,10 @@ int ipfs_node_link_protobuf_decode(unsigned char* buffer, size_t buffer_length,
unsigned char* hash; unsigned char* hash;
if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&hash, &hash_size, &bytes_read) == 0) if (protobuf_decode_length_delimited(&buffer[pos], buffer_length - pos, (char**)&hash, &hash_size, &bytes_read) == 0)
goto exit; goto exit;
link->hash = (unsigned char*)malloc(hash_size - 2);
link->hash_size = 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); strncpy((char*)link->hash, (char*)hash, link->hash_size);
link->hash[hash_size-1] = 0; link->hash[link->hash_size-1] = 0;
free(hash); free(hash);
pos += bytes_read; pos += bytes_read;
break; break;

View file

@ -52,6 +52,40 @@ int ipfs_unixfs_new(struct UnixFS** obj) {
return 1; 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) { int ipfs_unixfs_free(struct UnixFS* obj) {
if (obj != NULL) { if (obj != NULL) {
if (obj->hash != NULL) { if (obj->hash != NULL) {
@ -60,6 +94,13 @@ int ipfs_unixfs_free(struct UnixFS* obj) {
if (obj->bytes != NULL) { if (obj->bytes != NULL) {
free(obj->bytes); 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); free(obj);
obj = NULL; obj = NULL;
} }
@ -106,6 +147,7 @@ int ipfs_unixfs_add_blocksize(const struct UnixFSBlockSizeNode* blocksize, struc
// we're the first one // we're the first one
unix_fs->block_size_head = (struct UnixFSBlockSizeNode*)malloc(sizeof(struct UnixFSBlockSizeNode)); 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->block_size = blocksize->block_size;
unix_fs->block_size_head->next = NULL;
} else { } else {
// find the last one // find the last one
while (last->next != NULL) { 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 = (struct UnixFSBlockSizeNode*)malloc(sizeof(struct UnixFSBlockSizeNode));
last->next->block_size = blocksize->block_size; 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; pos += bytes_read;
break; break;
case (4): { // block sizes (linked list from varint) case (4): { // block sizes (linked list from varint)
struct UnixFSBlockSizeNode* currNode = (struct UnixFSBlockSizeNode*)malloc(sizeof(struct UnixFSBlockSizeNode)); struct UnixFSBlockSizeNode bs;
if (currNode == NULL) bs.next = NULL;
return 0; bs.block_size = varint_decode(&incoming[pos], incoming_size - pos, &bytes_read);
currNode->next = NULL; ipfs_unixfs_add_blocksize(&bs, result);
currNode->block_size = varint_decode(&incoming[pos], incoming_size - pos, &bytes_read);
pos += bytes_read; 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; break;
} }
} }