From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on inbox.vuxu.org X-Spam-Level: X-Spam-Status: No, score=-3.3 required=5.0 tests=MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,RCVD_IN_MSPIKE_H3,RCVD_IN_MSPIKE_WL autolearn=ham autolearn_force=no version=3.4.4 Received: (qmail 14113 invoked from network); 2 Aug 2020 10:10:16 -0000 Received: from mother.openwall.net (195.42.179.200) by inbox.vuxu.org with ESMTPUTF8; 2 Aug 2020 10:10:16 -0000 Received: (qmail 1979 invoked by uid 550); 2 Aug 2020 10:10:12 -0000 Mailing-List: contact musl-help@lists.openwall.com; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-ID: Reply-To: musl@lists.openwall.com Received: (qmail 1957 invoked from network); 2 Aug 2020 10:10:11 -0000 X-IronPort-AV: E=Sophos;i="5.75,425,1589234400"; d="scan'208";a="355797955" Date: Sun, 2 Aug 2020 12:09:58 +0200 From: Jens Gustedt To: Ariadne Conill Cc: musl@lists.openwall.com Message-ID: <20200802120958.19ba400a@inria.fr> In-Reply-To: <20200801214216.10452-1-ariadne@dereferenced.org> References: <20200801214216.10452-1-ariadne@dereferenced.org> Organization: inria.fr X-Mailer: Claws Mail 3.17.5git22 (GTK+ 2.24.32; x86_64-pc-linux-gnu) X-Face: iVBORw0KGgoAAAANSUhEUgAAADAAAAAwBAMAAAClLOS0AAAAAXNSR0IArs4c6QAAACRQTFRFERslNjAsLTE9Ok9wUk9TaUs8iWhSrYZkj42Rz6aD3sGZ MIME-Version: 1.0 Content-Type: multipart/signed; boundary="Sig_/zMmG_YsWbG+.g5./8mpgFB="; protocol="application/pgp-signature"; micalg=pgp-sha1 Subject: Re: [musl] [PATCH v3] implement recallocarray(3) --Sig_/zMmG_YsWbG+.g5./8mpgFB= Content-Type: text/plain; charset=US-ASCII Content-Transfer-Encoding: quoted-printable 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. >=20 > This extension is placed in _BSD_SOURCE, like > reallocarray(3). >=20 > Changes from v2: > - drop overflow checking for old size >=20 > 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 >=20 > 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) =3D=3D 0xffff) > void *reallocarray (void *, size_t, size_t); > +void *recallocarray (void *, size_t, size_t, size_t); > #endif > =20 > #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 =3D om * n, new_size; > + > + if (n && m > -1 / n) { > + errno =3D ENOMEM; > + return 0; > + } > + new_size =3D m * n; > + > + if (new_size <=3D old_size) { > + memset((char *) ptr + new_size, 0, old_size - > new_size); > + } > + > + newptr =3D realloc(ptr, m * n); I think, this would better be newptr =3D 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 =3D=3D 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 --=20 :: 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 :: --Sig_/zMmG_YsWbG+.g5./8mpgFB= Content-Type: application/pgp-signature Content-Description: Digitale Signatur von OpenPGP -----BEGIN PGP SIGNATURE----- iF0EARECAB0WIQSN9stI2OFN1pLljN0P0+hp2tU34gUCXyaQ9gAKCRAP0+hp2tU3 4sLXAJ0WVpYnXiwc1TK/e/Rm+AE1OYV37gCeO7nSjtF4yv6V5FLEibrpckqlAEI= =CmMZ -----END PGP SIGNATURE----- --Sig_/zMmG_YsWbG+.g5./8mpgFB=--