From b4bf0e3f4cae08358570784902761348b92bbec5 Mon Sep 17 00:00:00 2001 From: Thomas Schmucker Date: Fri, 26 Jun 2020 10:47:16 +0200 Subject: Überarbeite die Speicherverwaltung... MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- csv.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) (limited to 'csv.c') diff --git a/csv.c b/csv.c index a4f9b51..2b39be0 100644 --- a/csv.c +++ b/csv.c @@ -12,6 +12,17 @@ #define CSV_DEFAULT_SEPARATOR ',' #endif +#if defined(__GNUC__) || defined(__clang__) +#define mul_overflow __builtin_mul_overflow +#else +static inline int +mul_overflow(size_t a, size_t b, size_t *out) +{ + *out = a * b; + return ( a != 0 && (*out / a) != b ); +} +#endif + // === CSV-MEMORY Interface === static void * @@ -19,7 +30,11 @@ csv_mem_allocate(size_t n, size_t sz, void *cb_arg) { (void) cb_arg; - return calloc(n, sz); + size_t len; + if ( mul_overflow(n, sz, &len) ) { + return NULL; + } + return malloc(len); } static void * @@ -28,7 +43,7 @@ csv_mem_reallocate(void *ptr, size_t n, size_t sz, void *cb_arg) (void) cb_arg; size_t len; - if ( __builtin_mul_overflow(n, sz, &len) ) { + if ( mul_overflow(n, sz, &len) ) { return NULL; } return realloc(ptr, len); -- cgit v1.3