void *kmallocu(size_t size) { assert_allowed(A_DYN_MEM); if (size < 1) return NULL; mem_node_t *prev = 0; mem_node_t *cur = free_nodes; while (cur) { if (cur->size >= size) break; prev = cur; cur = cur->next; } if (!cur) { /* get some more memory */ size_t num_pages = size / PAGE_SIZE; if ((size % PAGE_SIZE) != 0) num_pages++; void *ptr = km_alloc_range(num_pages); cur = create_node(size, ptr, 0); /* there's enough free size to get another node in there */ if ((num_pages * PAGE_SIZE) > size) { create_node((num_pages * PAGE_SIZE) - size, ptr + size, 1); } } else { /* got a free node with the right size, remove it from the list and return the pointer */ if (!prev) free_nodes = cur->next; else prev->next = cur->next; append_node(&used_nodes, cur); if (cur->size > size) { /* create a block for the rest of the memory */ create_node(cur->size - size, cur->ptr + size, 1); cur->size = size; } } return cur->ptr; }
static void test_invalid_objects(bool should_allow_invalid) { git_treebuilder *builder; git_oid valid_blob_id, invalid_blob_id, valid_tree_id, invalid_tree_id; #define assert_allowed(expr) \ clar__assert(!(expr) == should_allow_invalid, __FILE__, __LINE__, \ (should_allow_invalid ? \ "Expected function call to succeed: " #expr : \ "Expected function call to fail: " #expr), \ NULL, 1) cl_git_pass(git_oid_fromstr(&valid_blob_id, blob_oid)); cl_git_pass(git_oid_fromstr(&invalid_blob_id, "1234567890123456789012345678901234567890")); cl_git_pass(git_oid_fromstr(&valid_tree_id, first_tree)); cl_git_pass(git_oid_fromstr(&invalid_tree_id, "0000000000111111111122222222223333333333")); cl_git_pass(git_treebuilder_new(&builder, g_repo, NULL)); /* test valid blobs and trees (these should always pass) */ cl_git_pass(git_treebuilder_insert(NULL, builder, "file.txt", &valid_blob_id, GIT_FILEMODE_BLOB)); cl_git_pass(git_treebuilder_insert(NULL, builder, "folder", &valid_tree_id, GIT_FILEMODE_TREE)); /* replace valid files and folders with invalid ones */ assert_allowed(git_treebuilder_insert(NULL, builder, "file.txt", &invalid_blob_id, GIT_FILEMODE_BLOB)); assert_allowed(git_treebuilder_insert(NULL, builder, "folder", &invalid_blob_id, GIT_FILEMODE_BLOB)); /* insert new invalid files and folders */ assert_allowed(git_treebuilder_insert(NULL, builder, "invalid_file.txt", &invalid_blob_id, GIT_FILEMODE_BLOB)); assert_allowed(git_treebuilder_insert(NULL, builder, "invalid_folder", &invalid_blob_id, GIT_FILEMODE_BLOB)); /* insert valid blobs as trees and trees as blobs */ assert_allowed(git_treebuilder_insert(NULL, builder, "file_as_folder", &valid_blob_id, GIT_FILEMODE_TREE)); assert_allowed(git_treebuilder_insert(NULL, builder, "folder_as_file.txt", &valid_tree_id, GIT_FILEMODE_BLOB)); #undef assert_allowed git_treebuilder_free(builder); }