|
Message-ID: <6718676e-9067-6a46-d25f-80c508e3976a@samersoff.net> Date: Sun, 2 Aug 2020 11:07:16 +0300 From: Dmitry Samersoff <dms@...ersoff.net> To: musl@...ts.openwall.com, Ariadne Conill <ariadne@...eferenced.org> Subject: Re: [PATCH v3] implement recallocarray(3) Ariadne, BSD (jemalloc) realloc always perform a new allocation and may return completely new pointer ever if new_size <= old_size. Also contract for realloc says that if allocation fails original content should remain untouched. I don't know how musl malloc perform in this case, but it might be better to move all memset after realloc and use newptr as a memeset base, with an appropriate error checking. -Dmitry On 02.08.2020 0:42, 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 <errno.h> > +#include <stdlib.h> > +#include <string.h> > + > +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); > + if (new_size > old_size) { > + memset((char *) ptr + old_size, 0, new_size - old_size); > + } > + > + return newptr; > +} >
Powered by blists - more mailing lists
Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.