diff options
| -rw-r--r-- | csv.c | 14 |
1 files changed, 10 insertions, 4 deletions
| @@ -25,22 +25,28 @@ csv_mem_allocate(size_t n, size_t sz, void *cb_arg) | |||
| 25 | static void * | 25 | static void * |
| 26 | csv_mem_reallocate(void *ptr, size_t n, size_t sz, void *cb_arg) | 26 | csv_mem_reallocate(void *ptr, size_t n, size_t sz, void *cb_arg) |
| 27 | { | 27 | { |
| 28 | void *reallocarray(void *ptr, size_t nmemb, size_t size); | 28 | size_t len; |
| 29 | 29 | ||
| 30 | (void) cb_arg; | 30 | (void) cb_arg; |
| 31 | 31 | ||
| 32 | return reallocarray(ptr, n, sz); | 32 | if ( !__builtin_mul_overflow(n, sz, &len) ) { |
| 33 | return realloc(ptr, len); | ||
| 34 | } | ||
| 35 | return NULL; | ||
| 33 | } | 36 | } |
| 34 | 37 | ||
| 35 | static void | 38 | static void |
| 36 | csv_mem_free(void *ptr, size_t n, size_t sz, void *cb_arg) | 39 | csv_mem_free(void *ptr, size_t n, size_t sz, void *cb_arg) |
| 37 | { | 40 | { |
| 41 | size_t len; | ||
| 42 | |||
| 38 | void explicit_bzero(void *b, size_t len); | 43 | void explicit_bzero(void *b, size_t len); |
| 39 | 44 | ||
| 40 | (void) cb_arg; | 45 | (void) cb_arg; |
| 41 | 46 | ||
| 42 | // TODO: Check for overflow! | 47 | if ( !__builtin_mul_overflow(n, sz, &len) ) { |
| 43 | explicit_bzero(ptr, n * sz); | 48 | explicit_bzero(ptr, len); |
| 49 | } | ||
| 44 | free(ptr); | 50 | free(ptr); |
| 45 | } | 51 | } |
| 46 | 52 | ||
