Hello, on Sat, 1 Aug 2020 15:42:16 -0600 you (Ariadne Conill ) wrote: > This OpenBSD extension is similar to reallocarray(3), but > zero-initializes the new memory area. > > This extension is placed in _BSD_SOURCE, like > reallocarray(3). > > Changes from v2: > - drop overflow checking for old size > > Changes from v1: > - use realloc() instead of reallocarray() > --- > include/stdlib.h | 1 + > src/malloc/recallocarray.c | 27 +++++++++++++++++++++++++++ > 2 files changed, 28 insertions(+) > create mode 100644 src/malloc/recallocarray.c > > diff --git a/include/stdlib.h b/include/stdlib.h > index b54a051f..a0412ad4 100644 > --- a/include/stdlib.h > +++ b/include/stdlib.h > @@ -146,6 +146,7 @@ int clearenv(void); > #define WCOREDUMP(s) ((s) & 0x80) > #define WIFCONTINUED(s) ((s) == 0xffff) > void *reallocarray (void *, size_t, size_t); > +void *recallocarray (void *, size_t, size_t, size_t); > #endif > > #ifdef _GNU_SOURCE > diff --git a/src/malloc/recallocarray.c b/src/malloc/recallocarray.c > new file mode 100644 > index 00000000..a7827604 > --- /dev/null > +++ b/src/malloc/recallocarray.c > @@ -0,0 +1,27 @@ > +#define _BSD_SOURCE > +#include > +#include > +#include > + > +void *recallocarray(void *ptr, size_t om, size_t m, size_t n) > +{ > + void *newptr; > + size_t old_size = om * n, new_size; > + > + if (n && m > -1 / n) { > + errno = ENOMEM; > + return 0; > + } > + new_size = m * n; > + > + if (new_size <= old_size) { > + memset((char *) ptr + new_size, 0, old_size - > new_size); > + } > + > + newptr = realloc(ptr, m * n); I think, this would better be newptr = realloc(ptr, new_size); > + if (new_size > old_size) { > + memset((char *) ptr + old_size, 0, new_size - old_size); > + } Generally, if `realloc` succeeds, access to the object behind `ptr` is invalid, even if `ptr == newptr`. Also `newptr` may be null if `realloc` fails, so this should read if (newptr && new_size > old_size) { memset((char *)newptr + old_size, 0, new_size - old_size); } Thanks Jens -- :: INRIA Nancy Grand Est ::: Camus ::::::: ICube/ICPS ::: :: ::::::::::::::: office Strasbourg : +33 368854536 :: :: :::::::::::::::::::::: gsm France : +33 651400183 :: :: ::::::::::::::: gsm international : +49 15737185122 :: :: http://icube-icps.unistra.fr/index.php/Jens_Gustedt ::