From aacf853876800788bda7e35a399a36618a6c246a Mon Sep 17 00:00:00 2001 From: Michael Zillgith Date: Fri, 15 Dec 2023 22:24:52 +0000 Subject: [PATCH] - config file parser dynamically allocates linebuffer to allow multithreaded applications (#484) --- src/iec61850/server/model/config_file_parser.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/src/iec61850/server/model/config_file_parser.c b/src/iec61850/server/model/config_file_parser.c index 8846ea8b..65d5847c 100644 --- a/src/iec61850/server/model/config_file_parser.c +++ b/src/iec61850/server/model/config_file_parser.c @@ -31,8 +31,6 @@ #define READ_BUFFER_MAX_SIZE 1024 -static uint8_t lineBuffer[READ_BUFFER_MAX_SIZE]; - static int readLine(FileHandle fileHandle, uint8_t* buffer, int maxSize) { @@ -118,6 +116,11 @@ ConfigFileParser_createModelFromConfigFileEx(const char* filename) IedModel* ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) { + uint8_t* lineBuffer = (uint8_t*)GLOBAL_MALLOC(READ_BUFFER_MAX_SIZE); + + if (lineBuffer == NULL) + goto exit_error; + int bytesRead = 1; bool stateInModel = false; @@ -541,8 +544,6 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) else goto exit_error; } - - } else { if (StringUtils_startsWith((char*) lineBuffer, "MODEL{")) { @@ -564,14 +565,18 @@ ConfigFileParser_createModelFromConfigFile(FileHandle fileHandle) } } + GLOBAL_FREEMEM(lineBuffer); + return model; exit_error: + + GLOBAL_FREEMEM(lineBuffer); + if (DEBUG_IED_SERVER) printf("IED_SERVER: error parsing line %i (indentation level = %i)\n", currentLine, indendation); IedModel_destroy(model); + return NULL; } - -