diff options
author | Theo de Raadt <deraadt@cvs.openbsd.org> | 2014-05-08 21:43:50 +0000 |
---|---|---|
committer | Theo de Raadt <deraadt@cvs.openbsd.org> | 2014-05-08 21:43:50 +0000 |
commit | 6fd61bcd610b8c7c6ee5fe5ff9723895a9d906e8 (patch) | |
tree | de2097818b36da0e55ccab9302af988f4bfd78b9 /lib | |
parent | 966ea5f4b5e23719e3a63ad656ef1a90727e91f8 (diff) |
move reallocarray() to a seperate file so that -portable applications
can avoid reinventing the wheel
ok guenther schwarze
Diffstat (limited to 'lib')
-rw-r--r-- | lib/libc/stdlib/Makefile.inc | 13 | ||||
-rw-r--r-- | lib/libc/stdlib/malloc.c | 13 | ||||
-rw-r--r-- | lib/libc/stdlib/reallocarray.c | 38 |
3 files changed, 46 insertions, 18 deletions
diff --git a/lib/libc/stdlib/Makefile.inc b/lib/libc/stdlib/Makefile.inc index 83b42c34e3d..80c3e5f5a1e 100644 --- a/lib/libc/stdlib/Makefile.inc +++ b/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/lib/libc/stdlib/malloc.c b/lib/libc/stdlib/malloc.c index 6f2a48ba4c5..a015fa229b5 100644 --- a/lib/libc/stdlib/malloc.c +++ b/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 <otto@drijf.net> * Copyright (c) 2012 Matthew Dempsky <matthew@openbsd.org> @@ -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/lib/libc/stdlib/reallocarray.c b/lib/libc/stdlib/reallocarray.c new file mode 100644 index 00000000000..7accd99e006 --- /dev/null +++ b/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 <otto@drijf.net> + * + * 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 <sys/types.h> +#include <errno.h> +#include <stdint.h> +#include <stdlib.h> + +/* + * 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); +} |