Browse Source

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.
Rich Felker 11 years ago
parent
commit
651416182d
2 changed files with 2 additions and 1 deletions
  1. 1 1
      src/malloc/aligned_alloc.c
  2. 1 0
      src/malloc/posix_memalign.c

+ 1 - 1
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;
 	}

+ 1 - 0
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;