From 298b829d5ae9260051b364ab5b3ae618d553c034 Mon Sep 17 00:00:00 2001 From: Julian Fang Date: Thu, 27 Jun 2019 21:24:59 +0800 Subject: [PATCH] Return EINVAL when alignment is not a power of 2 Consider to match the standard of posix, added a check of power of 2 to alignment in posix_memalign. Since, the check of multiple of sizeof(void*) contains the check of 0. I just check if alignment is a power of 2 behind without consider the condition it is 0. Splited the line to 2 for it is too long. --- src/alloc-override.c | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/alloc-override.c b/src/alloc-override.c index e06a3e6e..bbe22e47 100644 --- a/src/alloc-override.c +++ b/src/alloc-override.c @@ -132,10 +132,8 @@ size_t malloc_usable_size(void *p) MI_FORWARD1(mi_usable_size,p) void cfree(void* p) MI_FORWARD0(mi_free, p) int posix_memalign(void** p, size_t alignment, size_t size) { - // TODO: the spec says we should return EINVAL also if alignment is not a power of 2. - // The spec also dictates we should not modify `*p` on an error. (issue#27) - // - if (alignment % sizeof(void*) != 0) return EINVAL; // no `p==NULL` check as it is declared as non-null + if ((alignment % sizeof(void*) != 0 ) && + ((alignment & (~alignment + 1)) == alignment)) return EINVAL; // no `p==NULL` check as it is declared as non-null void* q = mi_malloc_aligned(size, alignment); if (q==NULL && size != 0) return ENOMEM; *p = q;