Пример #1
0
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;
}
Пример #2
0
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);
}