diff options
-rw-r--r-- | configure.ac | 7 | ||||
-rw-r--r-- | lib/reallocarray.c | 46 | ||||
-rw-r--r-- | src/flexdef.h | 4 |
3 files changed, 56 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index f60203f..4350f9d 100644 --- a/configure.ac +++ b/configure.ac @@ -125,7 +125,12 @@ AC_FUNC_ALLOCA AC_FUNC_FORK AC_FUNC_MALLOC AC_FUNC_REALLOC -AC_CHECK_FUNCS([dup2 memset pow regcomp setlocale strchr strdup strtol]) + +AC_CHECK_FUNCS([dup2 memset pow reallocarray regcomp setlocale strchr strdup strtol]) + +if [ "$ac_cv_func_reallocarray" = "no" ] ; then + AC_LIBOBJ([reallocarray]) +fi AC_CONFIG_FILES( Makefile diff --git a/lib/reallocarray.c b/lib/reallocarray.c new file mode 100644 index 0000000..11d1e7b --- /dev/null +++ b/lib/reallocarray.c @@ -0,0 +1,46 @@ +/* $OpenBSD: reallocarray.c,v 1.2 2014/12/08 03:45:00 bcook 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. + */ + +/* OPENBSD ORIGINAL: lib/libc/stdlib/reallocarray.c */ + +#include <config.h> +#ifndef HAVE_REALLOCARRAY + +#include <sys/types.h> +#include <errno.h> +#ifdef HAVE_STDINT_H +#include <stdint.h> +#endif +#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 ((size_t)1 << (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); +} +#endif /* HAVE_REALLOCARRAY */ diff --git a/src/flexdef.h b/src/flexdef.h index ee75efc..406ae70 100644 --- a/src/flexdef.h +++ b/src/flexdef.h @@ -645,6 +645,10 @@ extern int sectnum, nummt, hshcol, dfaeql, numeps, eps2, num_reallocs; extern int tmpuses, totnst, peakpairs, numuniq, numdup, hshsave; extern int num_backing_up, bol_needed; +#ifndef HAVE_REALLOCARRAY +void *reallocarray(void *, size_t, size_t); +#endif + void *allocate_array PROTO ((int, size_t)); void *reallocate_array PROTO ((void *, int, size_t)); |