From: Rich Felker Date: Fri, 5 Jul 2013 03:54:12 +0000 (-0400) Subject: move alignment check from aligned_alloc to posix_memalign X-Git-Tag: v0.9.12~83 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=651416182dc65d75e91cadfec65dd72f9ff07846;p=oweals%2Fmusl.git move alignment check from aligned_alloc to posix_memalign C11 has no requirement that the alignment be a multiple of sizeof(void*), and in fact seems to require any "valid alignment supported by the implementation" to work. since the alignment of char is 1 and thus a valid alignment, an alignment argument of 1 should be accepted. --- diff --git a/src/malloc/aligned_alloc.c b/src/malloc/aligned_alloc.c index 158dba41..c6386629 100644 --- a/src/malloc/aligned_alloc.c +++ b/src/malloc/aligned_alloc.c @@ -11,7 +11,7 @@ void *aligned_alloc(size_t align, size_t len) unsigned char *mem, *new, *end; size_t header, footer; - if ((align & -align & -sizeof(void *)) != align) { + if ((align & -align) != align) { errno = EINVAL; return NULL; } diff --git a/src/malloc/posix_memalign.c b/src/malloc/posix_memalign.c index 42cf2740..ad4d8f47 100644 --- a/src/malloc/posix_memalign.c +++ b/src/malloc/posix_memalign.c @@ -3,6 +3,7 @@ int posix_memalign(void **res, size_t align, size_t len) { + if (align < sizeof(void *)) return EINVAL; void *mem = aligned_alloc(align, len); if (!mem) return errno; *res = mem;