From 8c860f3d7fd2d0e028df1c2e252366a4c9f98130 Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Sun, 19 Apr 2020 15:47:25 -0500 Subject: [PATCH] Fall back to calloc when __builtin_mul_overflow isn't available Check for __builtin_mul_overflow at configure time, and fall back to calloc when it's not found. Thanks to Greg Troxel for reporting the problem. Signed-off-by: Rob Browning Tested-by: Rob Browning --- config/configure | 19 +++++++++++++++++++ lib/bup/_helpers.c | 22 +++++++++++++++------- 2 files changed, 34 insertions(+), 7 deletions(-) diff --git a/config/configure b/config/configure index 33e9ba2..fbf174f 100755 --- a/config/configure +++ b/config/configure @@ -97,6 +97,25 @@ AC_CHECK_FUNCS utimes AC_CHECK_FUNCS lutimes +builtin_mul_overflow_code=" +#include +int main(int argc, char **argv) +{ + size_t n = 0, size = 0, total; + __builtin_mul_overflow(n, size, &total); + return 0; +} +" + +TLOGN "checking for __builtin_mul_overflow" +if bup_try_c_code "$builtin_mul_overflow_code"; then + AC_DEFINE BUP_HAVE_BUILTIN_MUL_OVERFLOW 1 + TLOG ' (found)' +else + TLOG ' (not found)' +fi + + AC_CHECK_FUNCS mincore mincore_incore_code=" diff --git a/lib/bup/_helpers.c b/lib/bup/_helpers.c index 5f13d6a..0ea5dff 100644 --- a/lib/bup/_helpers.c +++ b/lib/bup/_helpers.c @@ -89,6 +89,20 @@ static state_t state; #endif // PY_MAJOR_VERSION >= 3 +static void *checked_calloc(size_t n, size_t size) +{ + void *result = calloc(n, size); + if (!result) + PyErr_NoMemory(); + return result; +} + +#ifndef BUP_HAVE_BUILTIN_MUL_OVERFLOW + +#define checked_malloc checked_calloc + +#else // defined BUP_HAVE_BUILTIN_MUL_OVERFLOW + static void *checked_malloc(size_t n, size_t size) { size_t total; @@ -105,13 +119,7 @@ static void *checked_malloc(size_t n, size_t size) return result; } -static void *checked_calloc(size_t n, size_t size) -{ - void *result = calloc(n, size); - if (!result) - PyErr_NoMemory(); - return result; -} +#endif // defined BUP_HAVE_BUILTIN_MUL_OVERFLOW #ifndef htonll -- 2.39.2