commit 7fae216ccfddbb1e5d8e154893cf0e5ebd54e5d6 from: Evan Burkey date: Mon May 6 18:17:34 2024 UTC implement reallocarray on macOS commit - 89a3585c7f3a1a5d10e036050111255e21856058 commit + 7fae216ccfddbb1e5d8e154893cf0e5ebd54e5d6 blob - 79b3c94830bab93d40d0770f2765540fe24ed423 blob + 0b76fe5109ed5a73cc38eafcb1e879f8d1979bd4 --- .idea/misc.xml +++ .idea/misc.xml @@ -1,4 +1,7 @@ + + \ No newline at end of file blob - fe54997d596620a84bd7c894c88380c50670787d blob + 4dde872bd863159c446a310946045764595ac6c6 --- include/lfmacos.h +++ include/lfmacos.h @@ -3,6 +3,8 @@ #if defined(__APPLE__) || defined(__MACH__) +#include + typedef struct { double total_user_time; double total_kernel_time; @@ -18,6 +20,7 @@ typedef struct { ProcessData *new_ProcessData(); int update_process(pid_t pid, ProcessData *proc); +void *reallocarray(void *optr, size_t nmemb, size_t size); #endif /* defined(__APPLE__) || defined(__MACH__) */ #endif /* LIBFLINT_MACOS_H */ blob - 57cd48e94bed6dbcfe054cc06a6ba8fb49e32989 blob + 3bbcf1c246a5b5475ef1fb51e62831f676c6dcf6 --- src/macos.c +++ src/macos.c @@ -1,6 +1,7 @@ #include #include #include +#include #include #include "lfmacos.h" @@ -43,3 +44,39 @@ int update_process(pid_t pid, ProcessData *proc) { return 0; } + +/* reallocarray is reimplemented here for macOS because Apple doesn't expose + * their implementation. This is taken straight from the OpenBSD source as + * shown in the below copyright notice + */ + +/* $OpenBSD: reallocarray.c,v 1.2 2014/12/08 03:45:00 bcook Exp $ */ +/* + * Copyright (c) 2008 Otto Moerbeek + * + * 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 */ + +#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); +} blob - 2179fc54a43d3a96847c8ee8d4bd85a7f12a6fb3 blob + bab701fb776df5b8b0f3ea23dc82bea98513860d --- src/vector.c +++ src/vector.c @@ -5,6 +5,10 @@ #include #endif +#if defined(__APPLE__) || defined(__MACH__) +#include "lfmacos.h" +#endif + #include "lfvector.h" #define VEC_INIT_CAP 2 @@ -32,11 +36,7 @@ int vec_init_with_capacity(Vector *vec, void (*destroy static int vec_grow(Vector *const vec) { vec->capacity *= 2; -#ifdef __OpenBSD__ vec->elements = reallocarray(vec->elements, vec->capacity, sizeof(void *)); -#else - vec->elements = reallocf(vec->elements, sizeof(void *) * vec->capacity); -#endif if (vec->elements == NULL) { return -1;