Path: blob/main/contrib/libdiff/compat/reallocarray.c
35065 views
/* $OpenBSD: reallocarray.c,v 1.3 2015/09/13 08:31:47 guenther Exp $ */1/*2* Copyright (c) 2008 Otto Moerbeek <[email protected]>3*4* Permission to use, copy, modify, and distribute this software for any5* purpose with or without fee is hereby granted, provided that the above6* copyright notice and this permission notice appear in all copies.7*8* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES9* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF10* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR11* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES12* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN13* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF14* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.15*/1617#include <sys/types.h>18#include <errno.h>19#include <stdint.h>20#include <stdlib.h>2122/*23* This is sqrt(SIZE_MAX+1), as s1*s2 <= SIZE_MAX24* if both s1 < MUL_NO_OVERFLOW and s2 < MUL_NO_OVERFLOW25*/26#define MUL_NO_OVERFLOW ((size_t)1 << (sizeof(size_t) * 4))2728void *29reallocarray(void *optr, size_t nmemb, size_t size)30{31if ((nmemb >= MUL_NO_OVERFLOW || size >= MUL_NO_OVERFLOW) &&32nmemb > 0 && SIZE_MAX / nmemb < size) {33errno = ENOMEM;34return NULL;35}36return realloc(optr, size * nmemb);37}383940