diff --git a/libc/Makefile b/libc/Makefile index 041a873c..160c4d6e 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -179,6 +179,7 @@ stdlib/mbstowcs.o \ stdlib/mbtowc.o \ stdlib/qsort.o \ stdlib/qsort_r.o \ +stdlib/reallocarray.o \ stdlib/realloc.o \ stdlib/strtod.o \ stdlib/strtof.o \ diff --git a/libc/include/stdlib.h b/libc/include/stdlib.h index 8d6db326..2af2d2a0 100644 --- a/libc/include/stdlib.h +++ b/libc/include/stdlib.h @@ -170,6 +170,7 @@ int unlockpt(int); uint32_t arc4random(void); void arc4random_buf(void*, size_t); uint32_t arc4random_uniform(uint32_t); +void* reallocarray(void*, size_t, size_t); #endif __END_DECLS diff --git a/libc/stdlib/reallocarray.cpp b/libc/stdlib/reallocarray.cpp new file mode 100644 index 00000000..52c134fe --- /dev/null +++ b/libc/stdlib/reallocarray.cpp @@ -0,0 +1,34 @@ +/******************************************************************************* + + Copyright(C) Jonas 'Sortie' Termansen 2014. + + This file is part of the Sortix C Library. + + The Sortix C Library is free software: you can redistribute it and/or modify + it under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + + The Sortix C Library is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with the Sortix C Library. If not, see . + + stdlib/reallocarray.cpp + Reallocates a chunk of memory from the dynamic memory heap. + +*******************************************************************************/ + +#include +#include +#include + +extern "C" void* reallocarray(void* ptr, size_t nmemb, size_t size) +{ + if ( size && nmemb && SIZE_MAX / size < nmemb ) + return errno = ENOMEM, (void*) NULL; + return realloc(ptr, nmemb * size); +}