From a14ce349c7772aedf85cb55e57ab3b1dc836ee59 Mon Sep 17 00:00:00 2001 From: deraadt <> Date: Thu, 8 May 2014 21:43:49 +0000 Subject: [PATCH] move reallocarray() to a seperate file so that -portable applications can avoid reinventing the wheel ok guenther schwarze --- src/lib/libc/stdlib/Makefile.inc | 13 +++++----- src/lib/libc/stdlib/malloc.c | 13 +--------- src/lib/libc/stdlib/reallocarray.c | 38 ++++++++++++++++++++++++++++++ 3 files changed, 46 insertions(+), 18 deletions(-) create mode 100644 src/lib/libc/stdlib/reallocarray.c diff --git a/src/lib/libc/stdlib/Makefile.inc b/src/lib/libc/stdlib/Makefile.inc index 83b42c34..80c3e5f5 100644 --- a/src/lib/libc/stdlib/Makefile.inc +++ b/src/lib/libc/stdlib/Makefile.inc @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile.inc,v 1.52 2014/04/22 14:26:26 tedu Exp $ +# $OpenBSD: Makefile.inc,v 1.53 2014/05/08 21:43:49 deraadt Exp $ # stdlib sources .PATH: ${LIBCSRCDIR}/arch/${MACHINE_CPU}/stdlib ${LIBCSRCDIR}/stdlib @@ -6,11 +6,12 @@ SRCS+= a64l.c abort.c atexit.c atoi.c atof.c atol.c atoll.c bsearch.c \ cfree.c exit.c ecvt.c gcvt.c getenv.c getopt_long.c \ getsubopt.c hcreate.c heapsort.c imaxabs.c imaxdiv.c l64a.c llabs.c \ - lldiv.c lsearch.c malloc.c merge.c posix_pty.c qsort.c radixsort.c \ - rand.c random.c realpath.c setenv.c strtoimax.c strtol.c \ - strtoll.c strtonum.c strtoul.c strtoull.c strtoumax.c system.c \ - tfind.c tsearch.c _rand48.c drand48.c erand48.c jrand48.c lcong48.c \ - lrand48.c mrand48.c nrand48.c seed48.c srand48.c qabs.c qdiv.c _Exit.c + lldiv.c lsearch.c malloc.c reallocarray.c merge.c posix_pty.c \ + qsort.c radixsort.c rand.c random.c realpath.c setenv.c strtoimax.c \ + strtol.c strtoll.c strtonum.c strtoul.c strtoull.c strtoumax.c \ + system.c tfind.c tsearch.c _rand48.c drand48.c erand48.c jrand48.c \ + lcong48.c lrand48.c mrand48.c nrand48.c seed48.c srand48.c qabs.c \ + qdiv.c _Exit.c .if (${MACHINE_CPU} == "i386") SRCS+= abs.S div.S labs.S ldiv.S diff --git a/src/lib/libc/stdlib/malloc.c b/src/lib/libc/stdlib/malloc.c index 6f2a48ba..a015fa22 100644 --- a/src/lib/libc/stdlib/malloc.c +++ b/src/lib/libc/stdlib/malloc.c @@ -1,4 +1,4 @@ -/* $OpenBSD: malloc.c,v 1.160 2014/05/07 20:07:59 halex Exp $ */ +/* $OpenBSD: malloc.c,v 1.161 2014/05/08 21:43:49 deraadt Exp $ */ /* * Copyright (c) 2008, 2010, 2011 Otto Moerbeek * Copyright (c) 2012 Matthew Dempsky @@ -1424,17 +1424,6 @@ calloc(size_t nmemb, size_t size) return r; } -void * -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 realloc(optr, size * nmemb); -} - static void * mapalign(struct dir_info *d, size_t alignment, size_t sz, int zero_fill) { diff --git a/src/lib/libc/stdlib/reallocarray.c b/src/lib/libc/stdlib/reallocarray.c new file mode 100644 index 00000000..7accd99e --- /dev/null +++ b/src/lib/libc/stdlib/reallocarray.c @@ -0,0 +1,38 @@ +/* $OpenBSD: reallocarray.c,v 1.1 2014/05/08 21:43:49 deraadt Exp $ */ +/* + * Copyright (c) 2008 Otto Moerbeek + * + * Permission to use, copy, modify, and distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include +#include +#include + +/* + * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX + * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW + */ +#define MUL_NO_OVERFLOW (1UL << (sizeof(size_t) * 4)) + +void * +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 realloc(optr, size * nmemb); +}