Annotation of mandoc/compat_reallocarray.c, Revision 1.4
1.1 schwarze 1: #include "config.h"
2:
1.3 schwarze 3: #if HAVE_REALLOCARRAY
1.1 schwarze 4:
5: int dummy;
6:
7: #else
8:
1.4 ! schwarze 9: /* $Id$ */
! 10: /* $OpenBSD: reallocarray.c,v 1.2 2014/12/08 03:45:00 bcook Exp $ */
1.1 schwarze 11: /*
12: * Copyright (c) 2008 Otto Moerbeek <otto@drijf.net>
13: *
14: * Permission to use, copy, modify, and distribute this software for any
15: * purpose with or without fee is hereby granted, provided that the above
16: * copyright notice and this permission notice appear in all copies.
17: *
18: * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
19: * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
20: * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
21: * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
22: * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
23: * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
24: * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
25: */
1.4 ! schwarze 26:
1.1 schwarze 27: #include <sys/types.h>
28: #include <errno.h>
29: #include <stdint.h>
30: #include <stdlib.h>
31:
1.4 ! schwarze 32: /*
! 33: * This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX
! 34: * if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW
! 35: */
! 36: #define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))
1.1 schwarze 37:
38: void *
39: reallocarray(void *optr, size_t nmemb, size_t size)
40: {
41: if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&
42: nmemb > 0 && SIZE_MAX / nmemb < size) {
43: errno = ENOMEM;
44: return NULL;
45: }
46: return realloc(optr, size * nmemb);
47: }
48:
49: #endif /*!HAVE_REALLOCARRAY*/
CVSweb