From 07d1cf3ec2098d6a83787a54ec96204e5e5b8d46 Mon Sep 17 00:00:00 2001 From: tedu <> Date: Tue, 22 Apr 2014 14:26:26 +0000 Subject: [PATCH] change mallocarray to reallocarray. useful in a few more situations. malloc can, as always, be emulated via realloc(NULL). ok deraadt --- src/include/stdlib.h | 4 ++-- src/lib/libc/stdlib/Makefile.inc | 4 ++-- src/lib/libc/stdlib/malloc.3 | 21 +++++++++------------ src/lib/libc/stdlib/malloc.c | 6 +++--- 4 files changed, 16 insertions(+), 19 deletions(-) diff --git a/src/include/stdlib.h b/src/include/stdlib.h index 93eddce7..71bb9f4f 100644 --- a/src/include/stdlib.h +++ b/src/include/stdlib.h @@ -1,4 +1,4 @@ -/* $OpenBSD: stdlib.h,v 1.57 2014/04/21 13:17:32 deraadt Exp $ */ +/* $OpenBSD: stdlib.h,v 1.58 2014/04/22 14:26:26 tedu Exp $ */ /* $NetBSD: stdlib.h,v 1.25 1995/12/27 21:19:08 jtc Exp $ */ /*- @@ -125,7 +125,7 @@ long labs(long); ldiv_t ldiv(long, long); void *malloc(size_t); #if __BSD_VISIBLE -void *mallocarray(size_t, size_t); +void *reallocarray(void *, size_t, size_t); #endif /* __BSD_VISIBLE */ void qsort(void *, size_t, size_t, int (*)(const void *, const void *)); int rand(void); diff --git a/src/lib/libc/stdlib/Makefile.inc b/src/lib/libc/stdlib/Makefile.inc index c8dc01c4..83b42c34 100644 --- a/src/lib/libc/stdlib/Makefile.inc +++ b/src/lib/libc/stdlib/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.51 2014/04/21 13:21:57 deraadt Exp $ +# $OpenBSD: Makefile.inc,v 1.52 2014/04/22 14:26:26 tedu Exp $ # stdlib sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/stdlib ${LIBCSRCDIR}/stdlib @@ -44,7 +44,7 @@ MLINKS+=insque.3 remque.3 MLINKS+=labs.3 llabs.3 MLINKS+=lsearch.3 lfind.3 MLINKS+=malloc.3 free.3 malloc.3 realloc.3 malloc.3 calloc.3 -MLINKS+=malloc.3 mallocarray.3 malloc.3 cfree.3 malloc.3 malloc.conf.5 +MLINKS+=malloc.3 reallocarray.3 malloc.3 cfree.3 malloc.3 malloc.conf.5 MLINKS+=qsort.3 heapsort.3 qsort.3 mergesort.3 MLINKS+=radixsort.3 sradixsort.3 MLINKS+=rand.3 srand.3 rand.3 rand_r.3 diff --git a/src/lib/libc/stdlib/malloc.3 b/src/lib/libc/stdlib/malloc.3 index 2a636b88..2f99ea9b 100644 --- a/src/lib/libc/stdlib/malloc.3 +++ b/src/lib/libc/stdlib/malloc.3 @@ -30,15 +30,15 @@ .\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF .\" SUCH DAMAGE. .\" -.\" $OpenBSD: malloc.3,v 1.74 2014/04/21 13:17:32 deraadt Exp $ +.\" $OpenBSD: malloc.3,v 1.75 2014/04/22 14:26:26 tedu Exp $ .\" -.Dd $Mdocdate: April 21 2014 $ +.Dd $Mdocdate: April 22 2014 $ .Dt MALLOC 3 .Os .Sh NAME .Nm malloc , .Nm calloc , -.Nm mallocarray , +.Nm reallocarray , .Nm realloc , .Nm free , .Nm cfree @@ -50,7 +50,7 @@ .Ft void * .Fn calloc "size_t nmemb" "size_t size" .Ft void * -.Fn mallocarray "size_t nmemb" "size_t size" +.Fn reallocarray "void *ptr" "size_t nmemb" "size_t size" .Ft void * .Fn realloc "void *ptr" "size_t size" .Ft void @@ -96,10 +96,10 @@ if ((p = malloc(num * size)) == NULL) .Pp The multiplication may lead to an integer overflow, which can be avoided using the extension -.Fn mallocarray , +.Fn reallocarray , as follows: .Bd -literal -offset indent -if ((p = mallocarray(num, size)) == NULL) +if ((p = reallocarray(NULL, num, size)) == NULL) err(1, "malloc"); .Ed .Pp @@ -125,6 +125,8 @@ objects, each of whose size is .Fa size . The space is initialized to zero. The use of +.Fn reallocarray +or .Fn calloc is strongly encouraged when allocating multiple sized objects in order to avoid possible integer overflows. @@ -309,11 +311,6 @@ malloc_options = "X"; .Pp Note that this will cause code that is supposed to handle out-of-memory conditions gracefully to abort instead. -.It Cm Z -.Dq Zero . -Fill some junk into the area allocated (see -.Cm J ) , -except for the exact length the user asked for, which is zeroed. .It Cm < .Dq Half the cache size . Decrease the size of the free page cache by a factor of two. @@ -494,6 +491,6 @@ random. A rewrite by Otto Moerbeek introducing a new central data structure and more randomization appeared in .Ox 4.4 . -.Fn mallocarray +.Fn reallocarray appeared in .Ox 5.6 . diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index b48dcb39..57907817 100644 --- a/src/lib/libc/stdlib/malloc.c +++ b/src/lib/libc/stdlib/malloc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: malloc.c,v 1.154 2014/04/21 13:17:32 deraadt Exp $ */ +/* $OpenBSD: malloc.c,v 1.155 2014/04/22 14:26:26 tedu Exp $ */ /* * Copyright (c) 2008, 2010, 2011 Otto Moerbeek * Copyright (c) 2012 Matthew Dempsky @@ -1433,14 +1433,14 @@ calloc(size_t nmemb, size_t size) } void * -mallocarray(size_t nmemb, size_t size) +reallocarray(void *optr, size_t nmemb, size_t size) { if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) && nmemb > 0 && SIZE_MAX / nmemb < size) { errno = ENOMEM; return NULL; } - return malloc(size * nmemb); + return realloc(optr, size * nmemb); } static void *