diff --git a/src/commit_list.c b/src/commit_list.c index 53612d514..28948c88b 100644 --- a/src/commit_list.c +++ b/src/commit_list.c @@ -47,7 +47,7 @@ git_commit_list *git_commit_list_insert_by_date(git_commit_list_node *item, git_ git_commit_list_node *git_commit_list_alloc_node(git_revwalk *walk) { - return (git_commit_list_node *)git_pool_malloc(&walk->commit_pool, COMMIT_ALLOC); + return (git_commit_list_node *)git_pool_mallocz(&walk->commit_pool, 1); } static int commit_error(git_commit_list_node *commit, const char *msg) diff --git a/src/merge.c b/src/merge.c index e84b1d3e3..a124cbdc9 100644 --- a/src/merge.c +++ b/src/merge.c @@ -626,7 +626,7 @@ static int merge_conflict_resolve_one_renamed( git_oid__cmp(&conflict->our_entry.id, &conflict->their_entry.id) != 0) return 0; - if ((merged = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry))) == NULL) + if ((merged = git_pool_mallocz(&diff_list->pool, sizeof(git_index_entry))) == NULL) return -1; if (ours_changed) @@ -711,7 +711,7 @@ static int merge_conflict_resolve_automerge( (error = git_odb_write(&automerge_oid, odb, result.ptr, result.len, GIT_OBJ_BLOB)) < 0) goto done; - if ((index_entry = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry))) == NULL) + if ((index_entry = git_pool_mallocz(&diff_list->pool, sizeof(git_index_entry))) == NULL) GITERR_CHECK_ALLOC(index_entry); index_entry->path = git_pool_strdup(&diff_list->pool, result.path); @@ -1342,7 +1342,7 @@ static git_merge_diff *merge_diff_from_index_entries( git_merge_diff *conflict; git_pool *pool = &diff_list->pool; - if ((conflict = git_pool_malloc(pool, sizeof(git_merge_diff))) == NULL) + if ((conflict = git_pool_mallocz(pool, sizeof(git_merge_diff))) == NULL) return NULL; if (index_entry_dup_pool(&conflict->ancestor_entry, pool, entries[TREE_IDX_ANCESTOR]) < 0 || @@ -1383,7 +1383,7 @@ static int merge_diff_list_insert_unmodified( int error = 0; git_index_entry *entry; - entry = git_pool_malloc(&diff_list->pool, sizeof(git_index_entry)); + entry = git_pool_mallocz(&diff_list->pool, sizeof(git_index_entry)); GITERR_CHECK_ALLOC(entry); if ((error = index_entry_dup_pool(entry, &diff_list->pool, tree_items[0])) >= 0) diff --git a/src/pool.c b/src/pool.c index fe6c42987..aab63beee 100644 --- a/src/pool.c +++ b/src/pool.c @@ -51,7 +51,6 @@ void git_pool_clear(git_pool *pool) } pool->pages = NULL; - pool->items = 0; } void git_pool_swap(git_pool *a, git_pool *b) @@ -73,7 +72,7 @@ static void *pool_alloc_page(git_pool *pool, uint32_t size) size_t alloc_size; if (GIT_ADD_SIZET_OVERFLOW(&alloc_size, new_page_size, sizeof(git_pool_page)) || - !(page = git__calloc(1, alloc_size))) + !(page = git__malloc(alloc_size))) return NULL; page->size = new_page_size; @@ -81,15 +80,12 @@ static void *pool_alloc_page(git_pool *pool, uint32_t size) page->next = pool->pages; pool->pages = page; - pool->items++; return page->data; } -void *git_pool_malloc(git_pool *pool, uint32_t items) +static void *pool_alloc(git_pool *pool, uint32_t size) { - const uint32_t size = items * pool->item_size; - git_pool_page *page = pool->pages; void *ptr = NULL; @@ -98,11 +94,25 @@ void *git_pool_malloc(git_pool *pool, uint32_t items) ptr = &page->data[page->size - page->avail]; page->avail -= size; - pool->items++; return ptr; } +void *git_pool_malloc(git_pool *pool, uint32_t items) +{ + const uint32_t size = items * pool->item_size; + return pool_alloc(pool, size); +} + +void *git_pool_mallocz(git_pool *pool, uint32_t items) +{ + const uint32_t size = items * pool->item_size; + void *ptr = pool_alloc(pool, size); + if (ptr) + memset(ptr, 0x0, size); + return ptr; +} + char *git_pool_strndup(git_pool *pool, const char *str, size_t n) { char *ptr = NULL; diff --git a/src/pool.h b/src/pool.h index ef71d4eb6..f9ac86773 100644 --- a/src/pool.h +++ b/src/pool.h @@ -31,7 +31,6 @@ typedef struct { git_pool_page *pages; /* pages with space left */ uint32_t item_size; /* size of single alloc unit in bytes */ uint32_t page_size; /* size of page in bytes */ - uint32_t items; } git_pool; /** @@ -66,17 +65,7 @@ extern void git_pool_swap(git_pool *a, git_pool *b); * Allocate space for one or more items from a pool. */ extern void *git_pool_malloc(git_pool *pool, uint32_t items); - -/** - * Allocate space and zero it out. - */ -GIT_INLINE(void *) git_pool_mallocz(git_pool *pool, uint32_t items) -{ - void *ptr = git_pool_malloc(pool, items); - if (ptr) - memset(ptr, 0, (size_t)items * (size_t)pool->item_size); - return ptr; -} +extern void *git_pool_mallocz(git_pool *pool, uint32_t items); /** * Allocate space and duplicate string data into it.