More memory fixes
This commit is contained in:
parent
1dcbf8962e
commit
3004f1411a
3 changed files with 52 additions and 18 deletions
|
@ -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);
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue