diff --git a/headers/posix/stdlib.h b/headers/posix/stdlib.h index 05f96b6c14..7db19888ea 100644 --- a/headers/posix/stdlib.h +++ b/headers/posix/stdlib.h @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006, Haiku Inc. All Rights Reserved. + * Copyright 2002-2007, Haiku Inc. All Rights Reserved. * Distributed under the terms of the MIT License. */ #ifndef _STDLIB_H_ @@ -45,11 +45,11 @@ extern "C" { #endif /* memory allocation (see malloc.h for additional defines & prototypes) */ -extern void *calloc(size_t nmemb, size_t size); +extern void *calloc(size_t numElements, size_t size); extern void free(void *pointer); extern void *malloc(size_t size); -extern void *realloc(void * ptr, size_t size); -extern int posix_memalign(void **memptr, size_t alignment, size_t size); +extern int posix_memalign(void **_pointer, size_t alignment, size_t size); +extern void *realloc(void *oldPointer, size_t newSize); /* process termination */ extern void abort(void); diff --git a/src/system/libroot/posix/malloc/wrapper.cpp b/src/system/libroot/posix/malloc/wrapper.cpp index 7ef6393faf..a926e1f563 100644 --- a/src/system/libroot/posix/malloc/wrapper.cpp +++ b/src/system/libroot/posix/malloc/wrapper.cpp @@ -1,5 +1,5 @@ /* - * Copyright 2002-2006, Haiku Inc. + * Copyright 2002-2007, Haiku Inc. * Distributed under the terms of the MIT License. */ @@ -260,7 +260,8 @@ extern "C" void * memalign(size_t alignment, size_t size) { static processHeap *pHeap = getAllocator(); - void *addr = pHeap->getHeap(pHeap->getHeapIndex()).memalign(alignment, size); + void *addr = pHeap->getHeap(pHeap->getHeapIndex()).memalign(alignment, + size); if (addr == NULL) { errno = B_NO_MEMORY; return NULL; @@ -275,14 +276,23 @@ memalign(size_t alignment, size_t size) extern "C" int -posix_memalign(void **memptr, size_t alignment, size_t size) +posix_memalign(void **_pointer, size_t alignment, size_t size) { - if (!memptr) - return EINVAL; - *memptr = memalign(alignment, size); - if (memptr == NULL) - return ENOMEM; - return 0; + if ((alignment & 3) != 0 || _pointer == NULL) + return B_BAD_VALUE; + + static processHeap *pHeap = getAllocator(); + void *pointer = pHeap->getHeap(pHeap->getHeapIndex()).memalign(alignment, + size); + if (pointer == NULL) + return NULL; + +#if HEAP_LEAK_CHECK + add_address(pointer, size); +#endif + + *_pointer = pointer; + return 0; }