Skip to content

Commit bd07ff6

Browse files
committed
fix memory leaks in parseModelStructureElement()
1 parent 4a44018 commit bd07ff6

3 files changed

Lines changed: 15 additions & 24 deletions

File tree

fmi4c/src/fmi4c.c

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1789,7 +1789,7 @@ bool parseModelDescriptionFmi3(fmiHandle *fmu)
17891789
int i=0;
17901790
outputElement = ezxml_child(modelStructureElement, "Output");
17911791
for(;outputElement;outputElement = outputElement->next) {
1792-
if(!parseModelStructureElement(&fmu->fmi3.outputs[i], &outputElement)) {
1792+
if(!parseModelStructureElement(&fmu->fmi3.outputs[i], &outputElement, fmu)) {
17931793
return false;
17941794
}
17951795
++i;
@@ -1799,7 +1799,7 @@ bool parseModelDescriptionFmi3(fmiHandle *fmu)
17991799
i=0;
18001800
continuousStateDerElement = ezxml_child(modelStructureElement, "ContinuousStateDerivative");
18011801
for(;continuousStateDerElement;continuousStateDerElement = continuousStateDerElement->next) {
1802-
if(!parseModelStructureElement(&fmu->fmi3.continuousStateDerivatives[i], &continuousStateDerElement)) {
1802+
if(!parseModelStructureElement(&fmu->fmi3.continuousStateDerivatives[i], &continuousStateDerElement, fmu)) {
18031803
return false;
18041804
}
18051805
++i;
@@ -1809,7 +1809,7 @@ bool parseModelDescriptionFmi3(fmiHandle *fmu)
18091809
i=0;
18101810
clockedStateElement = ezxml_child(modelStructureElement, "ClockedState");
18111811
for(;clockedStateElement;clockedStateElement = clockedStateElement->next) {
1812-
if(!parseModelStructureElement(&fmu->fmi3.clockedStates[i], &clockedStateElement)) {
1812+
if(!parseModelStructureElement(&fmu->fmi3.clockedStates[i], &clockedStateElement, fmu)) {
18131813
return false;
18141814
}
18151815
++i;
@@ -1819,7 +1819,7 @@ bool parseModelDescriptionFmi3(fmiHandle *fmu)
18191819
i=0;
18201820
initialUnknownElement = ezxml_child(modelStructureElement, "IninitalUnknown");
18211821
for(;initialUnknownElement;initialUnknownElement = initialUnknownElement->next) {
1822-
if(!parseModelStructureElement(&fmu->fmi3.initialUnknowns[i], &initialUnknownElement)) {
1822+
if(!parseModelStructureElement(&fmu->fmi3.initialUnknowns[i], &initialUnknownElement, fmu)) {
18231823
return false;
18241824
}
18251825
++i;
@@ -1829,7 +1829,7 @@ bool parseModelDescriptionFmi3(fmiHandle *fmu)
18291829
i=0;
18301830
eventIndicatorElement = ezxml_child(modelStructureElement, "EventIndicator");
18311831
for(;eventIndicatorElement;eventIndicatorElement = eventIndicatorElement->next) {
1832-
if(!parseModelStructureElement(&fmu->fmi3.eventIndicators[i], &eventIndicatorElement)) {
1832+
if(!parseModelStructureElement(&fmu->fmi3.eventIndicators[i], &eventIndicatorElement, fmu)) {
18331833
return false;
18341834
}
18351835
++i;

fmi4c/src/fmi4c_utils.c

Lines changed: 9 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -249,21 +249,20 @@ bool parseUInt8AttributeEzXml(ezxml_t element, const char *attributeName, uint8_
249249
return false;
250250
}
251251

252-
bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *element)
252+
bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *element, fmiHandle *fmu)
253253
{
254254
//Count number of dependencies
255255
output->numberOfDependencies = 0;
256256
const char* dependencies = NULL;
257-
if(parseStringAttributeEzXml(*element, "dependencies", &dependencies)) {
257+
if(parseStringAttributeEzXmlAndRememberPointer(*element, "dependencies", &dependencies, fmu)) {
258258

259259
if(dependencies == NULL || dependencies[0] == '\0') {
260260
//If dependencies is empty, no need to parse further
261261
return true;
262262
}
263263

264264
//Duplicate the dependencies string to make it mutable
265-
char* nonConstDependencies = _strdup(dependencies);
266-
free((char*)dependencies);
265+
char* nonConstDependencies = duplicateAndRememberString(fmu, dependencies);
267266

268267
if (nonConstDependencies == NULL) {
269268
return false; //strdup failed, handle as an error
@@ -279,7 +278,7 @@ bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *elem
279278

280279

281280
//Allocate memory for dependencies
282-
output->dependencies = malloc(output->numberOfDependencies*sizeof(fmi3ValueReference));
281+
output->dependencies = mallocAndRememberPointer(fmu, output->numberOfDependencies*sizeof(fmi3ValueReference));
283282

284283
//Read dependencies
285284
const char* delim = " ";
@@ -294,14 +293,12 @@ bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *elem
294293

295294
//Parse depenendency kinds element if present
296295
const char* dependencyKinds = NULL;
297-
parseStringAttributeEzXml(*element, "dependencyKinds", &dependencyKinds);
296+
parseStringAttributeEzXmlAndRememberPointer(*element, "dependencyKinds", &dependencyKinds, fmu);
298297
if(dependencyKinds) {
299-
char* nonConstDependencyKinds = _strdup(dependencyKinds);
300-
free((char*)dependencyKinds);
298+
char* nonConstDependencyKinds = duplicateAndRememberString(fmu, dependencyKinds);
301299

302300
//Allocate memory for dependencies (assume same number as dependencies, according to FMI3 specification)
303-
output->dependencies = malloc(output->numberOfDependencies*sizeof(fmi3ValueReference));
304-
301+
output->dependencies = mallocAndRememberPointer(fmu, output->numberOfDependencies*sizeof(fmi3ValueReference));
305302
//Read dependency kinds
306303
for(int j=0; j<output->numberOfDependencies; ++j) {
307304
const char* kind;
@@ -313,9 +310,7 @@ bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *elem
313310
}
314311

315312
if(!strcmp(kind, "independent")) {
316-
fmi4cErrorMessage = _strdup("Dependency kind = \"independent\" is not allowed for output dependencies.");
317-
free(nonConstDependencyKinds);
318-
free(nonConstDependencies);
313+
fmi4cErrorMessage = duplicateAndRememberString(fmu, "Dependency kind = \"independent\" is not allowed for output dependencies.");
319314
return false;
320315
}
321316
else if(!strcmp(kind, "constant")) {
@@ -334,15 +329,11 @@ bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *elem
334329
output->dependencyKinds[j] = fmi3Dependent;
335330
}
336331
else {
337-
fmi4cErrorMessage = _strdup("Unknown dependency kind for output dependency.");
338-
free(nonConstDependencyKinds);
339-
free(nonConstDependencies);
332+
fmi4cErrorMessage = duplicateAndRememberString(fmu, "Unknown dependency kind for output dependency.");
340333
return false;
341334
}
342335
}
343-
free(nonConstDependencyKinds);
344336
}
345-
free(nonConstDependencies);
346337
}
347338

348339
return true;

fmi4c/src/fmi4c_utils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,6 @@ bool parseUInt32AttributeEzXml(ezxml_t element, const char* attributeName, uint3
2929
bool parseUInt16AttributeEzXml(ezxml_t element, const char *attributeName, uint16_t* target);
3030
bool parseUInt8AttributeEzXml(ezxml_t element, const char *attributeName, uint8_t *target);
3131

32-
bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *element);
32+
bool parseModelStructureElement(fmi3ModelStructureElement *output, ezxml_t *element, fmiHandle *fmu);
3333

3434
#endif // FMIC_UTILS_H

0 commit comments

Comments
 (0)