]> git.proxmox.com Git - libgit2.git/commitdiff
pool: Never return unaligned buffers
authorVicent Marti <tanoku@gmail.com>
Thu, 12 Nov 2015 19:51:01 +0000 (20:51 +0100)
committerCarlos Martín Nieto <cmn@dwim.me>
Fri, 13 Nov 2015 03:57:19 +0000 (04:57 +0100)
src/pool.c
tests/core/pool.c

index aab63beee32c7a47419d6680f610bbf2552f7783..e519b75bb7866f919007b4349cf6328da1704ace 100644 (file)
@@ -8,7 +8,7 @@ struct git_pool_page {
        git_pool_page *next;
        uint32_t size;
        uint32_t avail;
-       char data[GIT_FLEX_ARRAY];
+       GIT_ALIGN(char data[GIT_FLEX_ARRAY], 8);
 };
 
 static void *pool_alloc_page(git_pool *pool, uint32_t size);
@@ -30,11 +30,8 @@ uint32_t git_pool__system_page_size(void)
 
 void git_pool_init(git_pool *pool, uint32_t item_size)
 {
-       const uint32_t align_size = sizeof(void *) - 1;
        assert(pool);
-
-       if (item_size > 1)
-               item_size = (item_size + align_size) & ~align_size;
+       assert(item_size >= 1);
 
        memset(pool, 0, sizeof(git_pool));
        pool->item_size = item_size;
@@ -98,15 +95,26 @@ static void *pool_alloc(git_pool *pool, uint32_t size)
        return ptr;
 }
 
+static uint32_t alloc_size(git_pool *pool, uint32_t count)
+{
+       const uint32_t align = sizeof(void *) - 1;
+
+       if (pool->item_size > 1) {
+               const uint32_t item_size = (pool->item_size + align) & ~align;
+               return item_size * count;
+       }
+
+       return (count + align) & ~align;
+}
+
 void *git_pool_malloc(git_pool *pool, uint32_t items)
 {
-       const uint32_t size = items * pool->item_size;
-       return pool_alloc(pool, size);
+       return pool_alloc(pool, alloc_size(pool, items));
 }
 
 void *git_pool_mallocz(git_pool *pool, uint32_t items)
 {
-       const uint32_t size = items * pool->item_size;
+       const uint32_t size = alloc_size(pool, items);
        void *ptr = pool_alloc(pool, size);
        if (ptr)
                memset(ptr, 0x0, size);
index f90adfbc3db224659c0241309b1ddd5ef4344527..c43c1db671482a762f79fcdf1f501efa3dbc9442 100644 (file)
@@ -32,7 +32,7 @@ void test_core_pool__1(void)
                cl_assert(git_pool_malloc(&p, i) != NULL);
 
        /* with fixed page size, allocation must end up with these values */
-       cl_assert_equal_i(590, git_pool__open_pages(&p));
+       cl_assert_equal_i(591, git_pool__open_pages(&p));
        git_pool_clear(&p);
 
        git_pool_init(&p, 1);
@@ -42,7 +42,7 @@ void test_core_pool__1(void)
                cl_assert(git_pool_malloc(&p, i) != NULL);
 
        /* with fixed page size, allocation must end up with these values */
-       cl_assert_equal_i(573, git_pool__open_pages(&p));
+       cl_assert_equal_i(sizeof(void *) == 8 ? 575 : 573, git_pool__open_pages(&p));
        git_pool_clear(&p);
 }