diff options
| author | Thomas Schmucker <ts@its1.de> | 2020-06-25 16:37:17 +0200 |
|---|---|---|
| committer | Thomas Schmucker <ts@its1.de> | 2020-06-25 16:37:17 +0200 |
| commit | ef9113ce4c32cecd31de972f0a5045664fe1dd49 (patch) | |
| tree | bb20b654d92c0d8058ef242abbc7d93f589f52fe | |
| parent | e3d40f167088dcbd9b566b01dedd10a1ff3b57c1 (diff) | |
| download | libcsv-ef9113ce4c32cecd31de972f0a5045664fe1dd49.tar.gz libcsv-ef9113ce4c32cecd31de972f0a5045664fe1dd49.tar.bz2 libcsv-ef9113ce4c32cecd31de972f0a5045664fe1dd49.zip | |
Bugfix: bei csv_mem_free() muss neben der Anzahl der Elemente auch deren Größe übergeben werden!
| -rw-r--r-- | csv.c | 9 | ||||
| -rw-r--r-- | csv.h | 2 |
2 files changed, 6 insertions, 5 deletions
| @@ -33,13 +33,14 @@ csv_mem_reallocate(void *ptr, size_t n, size_t sz, void *cb_arg) | |||
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | static void | 35 | static void |
| 36 | csv_mem_free(void *ptr, size_t sz, void *cb_arg) | 36 | csv_mem_free(void *ptr, size_t n, size_t sz, void *cb_arg) |
| 37 | { | 37 | { |
| 38 | void explicit_bzero(void *b, size_t len); | 38 | void explicit_bzero(void *b, size_t len); |
| 39 | 39 | ||
| 40 | (void) cb_arg; | 40 | (void) cb_arg; |
| 41 | 41 | ||
| 42 | explicit_bzero(ptr, sz); | 42 | // TODO: Check for overflow! |
| 43 | explicit_bzero(ptr, n * sz); | ||
| 43 | free(ptr); | 44 | free(ptr); |
| 44 | } | 45 | } |
| 45 | 46 | ||
| @@ -133,7 +134,7 @@ csv_string_free(csv_string_t *csv_string, const csv_options_t * const csv_option | |||
| 133 | assert(csv_string != NULL); | 134 | assert(csv_string != NULL); |
| 134 | assert(csv_options != NULL); | 135 | assert(csv_options != NULL); |
| 135 | 136 | ||
| 136 | csv_options->cb_free(csv_string->str, csv_string->cap, csv_options->cb_memory_arg); | 137 | csv_options->cb_free(csv_string->str, csv_string->cap, 1, csv_options->cb_memory_arg); |
| 137 | 138 | ||
| 138 | // call *_init() for sane default values; prevent possible double-free | 139 | // call *_init() for sane default values; prevent possible double-free |
| 139 | csv_string_init(csv_string); | 140 | csv_string_init(csv_string); |
| @@ -197,7 +198,7 @@ csv_field_free(csv_field_t *csv_field, const csv_options_t * const csv_options) | |||
| 197 | assert(csv_field != NULL); | 198 | assert(csv_field != NULL); |
| 198 | assert(csv_options != NULL); | 199 | assert(csv_options != NULL); |
| 199 | 200 | ||
| 200 | csv_options->cb_free(csv_field->fields, csv_field->cap, csv_options->cb_memory_arg); | 201 | csv_options->cb_free(csv_field->fields, csv_field->cap, sizeof(csv_field->fields[0]), csv_options->cb_memory_arg); |
| 201 | 202 | ||
| 202 | csv_field_init(csv_field); | 203 | csv_field_init(csv_field); |
| 203 | } | 204 | } |
| @@ -25,7 +25,7 @@ typedef struct { | |||
| 25 | 25 | ||
| 26 | void *(*cb_allocate)(size_t, size_t, void *); | 26 | void *(*cb_allocate)(size_t, size_t, void *); |
| 27 | void *(*cb_reallocate)(void *, size_t, size_t, void *); | 27 | void *(*cb_reallocate)(void *, size_t, size_t, void *); |
| 28 | void (*cb_free)(void *, size_t sz, void *); | 28 | void (*cb_free)(void *, size_t, size_t sz, void *); |
| 29 | void *cb_memory_arg; | 29 | void *cb_memory_arg; |
| 30 | } csv_options_t; | 30 | } csv_options_t; |
| 31 | 31 | ||
