diff --git a/headers/posix/stdlib.h b/headers/posix/stdlib.h index 5f5d586085..51a965f17a 100644 --- a/headers/posix/stdlib.h +++ b/headers/posix/stdlib.h @@ -51,6 +51,7 @@ extern void *malloc(size_t size); extern int posix_memalign(void **_pointer, size_t alignment, size_t size); extern void *aligned_alloc(size_t alignment, size_t size) _ALIGNED_BY_ARG(1); extern void *realloc(void *oldPointer, size_t newSize); +extern void *reallocarray(void *ptr, size_t nelem, size_t elsize); /* process termination */ extern void abort(void) __attribute__((noreturn)); diff --git a/src/system/libroot/posix/stdlib/Jamfile b/src/system/libroot/posix/stdlib/Jamfile index 6ba1421e7f..77aa08c154 100644 --- a/src/system/libroot/posix/stdlib/Jamfile +++ b/src/system/libroot/posix/stdlib/Jamfile @@ -28,6 +28,7 @@ for architectureObject in [ MultiArchSubDirSetup ] { qsort.c radixsort.c random.c + reallocarray.cpp realpath.cpp strfmon.c strtol.c diff --git a/src/system/libroot/posix/stdlib/reallocarray.cpp b/src/system/libroot/posix/stdlib/reallocarray.cpp new file mode 100644 index 0000000000..4fb44ae5af --- /dev/null +++ b/src/system/libroot/posix/stdlib/reallocarray.cpp @@ -0,0 +1,21 @@ +/* + * Copyright 2024, Jérôme Duval, jerome.duval@gmail.com + * Distributed under the terms of the MIT License. + */ + + +#include + +#include +#include + + +extern "C" void* +reallocarray(void* ptr, size_t nelem, size_t elsize) +{ + if (elsize != 0 && nelem != 0 && nelem > SIZE_MAX / elsize) { + errno = ENOMEM; + return NULL; + } + return realloc(ptr, nelem * elsize); +}