fast-import: fix unalinged allocation and access
The specialized pool allocator fast-import uses aligned objects on the size of a pointer, which was not sufficient at least on Sparc. Instead, make the alignment for objects of type unitmax_t. Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
896c0535af
commit
69ae517541
@ -196,7 +196,7 @@ struct mem_pool
|
|||||||
struct mem_pool *next_pool;
|
struct mem_pool *next_pool;
|
||||||
char *next_free;
|
char *next_free;
|
||||||
char *end;
|
char *end;
|
||||||
char space[FLEX_ARRAY]; /* more */
|
uintmax_t space[FLEX_ARRAY]; /* more */
|
||||||
};
|
};
|
||||||
|
|
||||||
struct atom_str
|
struct atom_str
|
||||||
@ -534,15 +534,15 @@ static void *pool_alloc(size_t len)
|
|||||||
total_allocd += sizeof(struct mem_pool) + mem_pool_alloc;
|
total_allocd += sizeof(struct mem_pool) + mem_pool_alloc;
|
||||||
p = xmalloc(sizeof(struct mem_pool) + mem_pool_alloc);
|
p = xmalloc(sizeof(struct mem_pool) + mem_pool_alloc);
|
||||||
p->next_pool = mem_pool;
|
p->next_pool = mem_pool;
|
||||||
p->next_free = p->space;
|
p->next_free = (char *) p->space;
|
||||||
p->end = p->next_free + mem_pool_alloc;
|
p->end = p->next_free + mem_pool_alloc;
|
||||||
mem_pool = p;
|
mem_pool = p;
|
||||||
}
|
}
|
||||||
|
|
||||||
r = p->next_free;
|
r = p->next_free;
|
||||||
/* round out to a pointer alignment */
|
/* round out to a 'uintmax_t' alignment */
|
||||||
if (len & (sizeof(void*) - 1))
|
if (len & (sizeof(uintmax_t) - 1))
|
||||||
len += sizeof(void*) - (len & (sizeof(void*) - 1));
|
len += sizeof(uintmax_t) - (len & (sizeof(uintmax_t) - 1));
|
||||||
p->next_free += len;
|
p->next_free += len;
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user