From 7983c6df6b2367e6d92a91b775834d8890858084 Mon Sep 17 00:00:00 2001 From: Markus Kasten Date: Fri, 8 Nov 2024 18:21:15 +0100 Subject: [PATCH 1/2] fix realloc crashing on linux --- read_bkn.c | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/read_bkn.c b/read_bkn.c index fec8be5..344c1ed 100644 --- a/read_bkn.c +++ b/read_bkn.c @@ -147,7 +147,12 @@ static struct bkn_method* read_bkn_method(struct bkn_file* bknFile, struct bkn_m while(true) { value = read_bkn_field(bknFile); - bknMethod->metadata = realloc(bknMethod->metadata, (bknMethod->numMetadata + 1) * sizeof(char*)); + size_t s = (bknMethod->numMetadata + 1) * sizeof(char*); + if (bknMethod->metadata == NULL) { + bknMethod->metadata = malloc(s); + } else { + bknMethod->metadata = realloc(bknMethod->metadata, s); + } if (bknMethod->metadata == NULL) { out_of_memory(); @@ -237,8 +242,14 @@ bool read_bkn(char* filePath, struct bkn_data* bknData) { // No more method data in file break; } - - bknData->methods = realloc(bknData->methods, (bknData->numMethods + 1) * sizeof(struct bkn_method)); + + size_t s = (bknData->numMethods + 1) * sizeof(struct bkn_method); + if (bknData->methods == NULL){ + bknData->methods = malloc(s); + memset(bknData->methods, 0, s); + } else { + bknData->methods = realloc(bknData->methods, s); + } if (bknData->methods == NULL) { out_of_memory(); From ee3ed83b72b3d349f8e60f99044bce6ee1e497a8 Mon Sep 17 00:00:00 2001 From: Markus Kasten Date: Sat, 9 Nov 2024 10:27:33 +0100 Subject: [PATCH 2/2] previous fix was not the real cause, add missing memset --- read_bkn.c | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/read_bkn.c b/read_bkn.c index 344c1ed..a9f5334 100644 --- a/read_bkn.c +++ b/read_bkn.c @@ -147,12 +147,7 @@ static struct bkn_method* read_bkn_method(struct bkn_file* bknFile, struct bkn_m while(true) { value = read_bkn_field(bknFile); - size_t s = (bknMethod->numMetadata + 1) * sizeof(char*); - if (bknMethod->metadata == NULL) { - bknMethod->metadata = malloc(s); - } else { - bknMethod->metadata = realloc(bknMethod->metadata, s); - } + bknMethod->metadata = realloc(bknMethod->metadata, (bknMethod->numMetadata + 1) * sizeof(char*)); if (bknMethod->metadata == NULL) { out_of_memory(); @@ -242,18 +237,13 @@ bool read_bkn(char* filePath, struct bkn_data* bknData) { // No more method data in file break; } - - size_t s = (bknData->numMethods + 1) * sizeof(struct bkn_method); - if (bknData->methods == NULL){ - bknData->methods = malloc(s); - memset(bknData->methods, 0, s); - } else { - bknData->methods = realloc(bknData->methods, s); - } + + bknData->methods = realloc(bknData->methods, (bknData->numMethods + 1) * sizeof(struct bkn_method)); if (bknData->methods == NULL) { out_of_memory(); } + memset(&bknData->methods[bknData->numMethods], 0, sizeof(struct bkn_method)); read_bkn_method(&bknFile, &bknData->methods[bknData->numMethods]); bknData->numMethods++;