1274876Sbapt#include "config.h"
2274876Sbapt
3275432Sbapt#if HAVE_REALLOCARRAY
4274876Sbapt
5274876Sbaptint dummy;
6274876Sbapt
7274876Sbapt#else
8274876Sbapt
9276219Sbapt/*	$Id: compat_reallocarray.c,v 1.4 2014/12/11 09:05:01 schwarze Exp $	*/
10276219Sbapt/*	$OpenBSD: reallocarray.c,v 1.2 2014/12/08 03:45:00 bcook Exp $	*/
11274876Sbapt/*
12274876Sbapt * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
13274876Sbapt *
14274876Sbapt * Permission to use, copy, modify, and distribute this software for any
15274876Sbapt * purpose with or without fee is hereby granted, provided that the above
16274876Sbapt * copyright notice and this permission notice appear in all copies.
17274876Sbapt *
18274876Sbapt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
19274876Sbapt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20274876Sbapt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
21274876Sbapt * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22274876Sbapt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23274876Sbapt * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
24274876Sbapt * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25274876Sbapt */
26276219Sbapt
27274876Sbapt#include <sys/types.h>
28274876Sbapt#include <errno.h>
29274876Sbapt#include <stdint.h>
30274876Sbapt#include <stdlib.h>
31274876Sbapt
32276219Sbapt/*
33276219Sbapt * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
34276219Sbapt * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
35276219Sbapt */
36276219Sbapt#define MUL_NO_OVERFLOW	((size_t)1 << (sizeof(size_t) * 4))
37274876Sbapt
38274876Sbaptvoid *
39274876Sbaptreallocarray(void *optr, size_t nmemb, size_t size)
40274876Sbapt{
41274876Sbapt	if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
42274876Sbapt	    nmemb > 0 && SIZE_MAX / nmemb < size) {
43274876Sbapt		errno = ENOMEM;
44274876Sbapt		return NULL;
45274876Sbapt	}
46274876Sbapt	return realloc(optr, size * nmemb);
47274876Sbapt}
48274876Sbapt
49274876Sbapt#endif /*!HAVE_REALLOCARRAY*/
50