Remove memory leaks in cmpp.

Two small ones (a few bytes) are still there, difficult to assess.
This commit is contained in:
Holger Vogt 2020-01-04 10:10:08 +01:00
parent 15c034803d
commit 146f94392d
6 changed files with 75 additions and 6 deletions

View File

@ -301,6 +301,7 @@ Status_t write_ifs_c_file(const char *filename, Ifs_Table_t *ifs_table);
FILE *fopen_cmpp(const char **path_p, const char *mode); FILE *fopen_cmpp(const char **path_p, const char *mode);
void rem_ifs_table(Ifs_Table_t *ifs_table);
/* /*
* type safe variants of the <ctype.h> functions for char arguments * type safe variants of the <ctype.h> functions for char arguments

View File

@ -44,6 +44,11 @@ NON-STANDARD FEATURES
/* *********************************************************************** */ /* *********************************************************************** */
static void txfree(void *ptr)
{
if(ptr)
free(ptr);
};
/* /*
preprocess_ifs_file preprocess_ifs_file
@ -65,7 +70,6 @@ void preprocess_ifs_file(void)
Status_t status; /* Return status */ Status_t status; /* Return status */
/* Read the entire ifspec.ifs file and load the data into ifs_table */ /* Read the entire ifspec.ifs file and load the data into ifs_table */
status = read_ifs_file(IFSPEC_FILENAME,GET_IFS_TABLE,&ifs_table); status = read_ifs_file(IFSPEC_FILENAME,GET_IFS_TABLE,&ifs_table);
@ -82,7 +86,34 @@ void preprocess_ifs_file(void)
if(status != OK) { if(status != OK) {
exit(1); exit(1);
} }
rem_ifs_table(&ifs_table);
}
void rem_ifs_table(Ifs_Table_t *ifs_table)
{
int i;
/* Remove the ifs_table */
txfree(ifs_table->name.c_fcn_name);
txfree(ifs_table->name.description);
txfree(ifs_table->name.model_name);
for(i = 0; i < ifs_table->num_conn; i++) {
txfree(ifs_table->conn[i].name);
txfree(ifs_table->conn[i].description);
txfree(ifs_table->conn[i].default_type);
}
for(i = 0; i < ifs_table->num_param; i++) {
txfree(ifs_table->param[i].name);
txfree(ifs_table->param[i].description);
}
for(i = 0; i < ifs_table->num_inst_var; i++) {
txfree(ifs_table->inst_var[i].name);
txfree(ifs_table->inst_var[i].description);
}
txfree(ifs_table->conn);
txfree(ifs_table->param);
txfree(ifs_table->inst_var);
} }

View File

@ -193,7 +193,16 @@ void preprocess_lst_files(void)
if(status != OK) { if(status != OK) {
exit(1); exit(1);
} }
/* remove model_info and node_info */
if (model_info) {
if(model_info->cfunc_name) free(model_info->cfunc_name);
if(model_info->path_name) free(model_info->path_name);
if(model_info->spice_name) free(model_info->spice_name);
}
if (node_info) {
if(node_info->node_name) free(node_info->node_name);
if(node_info->path_name) free(node_info->path_name);
}
} }
@ -309,6 +318,9 @@ static Status_t read_modpath(
*num_models = n; *num_models = n;
*model_info = model; *model_info = model;
if(filename)
free((char*)filename);
return(OK); return(OK);
} }
@ -424,6 +436,9 @@ static Status_t read_udnpath(
*num_nodes = n; *num_nodes = n;
*node_info = node; *node_info = node;
if(filename)
free((char*)filename);
return(OK); return(OK);
} }
@ -467,14 +482,17 @@ static Status_t read_model_names(
/* Transfer the names into the model_info structure */ /* Transfer the names into the model_info structure */
if(status == OK) { if(status == OK) {
model_info[i].spice_name = ifs_table.name.model_name; model_info[i].spice_name = strdup(ifs_table.name.model_name);
model_info[i].cfunc_name = ifs_table.name.c_fcn_name; model_info[i].cfunc_name = strdup(ifs_table.name.c_fcn_name);
} }
else { else {
all_found = FALSE; all_found = FALSE;
print_error("ERROR - Problems reading %s in directory %s", print_error("ERROR - Problems reading %s in directory %s",
IFSPEC_FILENAME, model_info[i].path_name); IFSPEC_FILENAME, model_info[i].path_name);
} }
/* Remove the ifs_table */
rem_ifs_table(&ifs_table);
} }
if(all_found) if(all_found)
@ -767,6 +785,8 @@ static Status_t write_CMextrn(
/* Close the file and return */ /* Close the file and return */
fclose(fp); fclose(fp);
if(filename)
free((char*)filename);
return(OK); return(OK);
} }
@ -808,6 +828,8 @@ static Status_t write_CMinfo(
/* Close the file and return */ /* Close the file and return */
fclose(fp); fclose(fp);
if(filename)
free((char*)filename);
return(OK); return(OK);
} }
@ -853,6 +875,8 @@ static Status_t write_UDNextrn(
/* Close the file and return */ /* Close the file and return */
fclose(fp); fclose(fp);
if(filename)
free((char*)filename);
return(OK); return(OK);
} }
@ -895,6 +919,8 @@ static Status_t write_UDNinfo(
} }
/* Close the file and return */ /* Close the file and return */
if(filename)
free((char*)filename);
fclose(fp); fclose(fp);
return(OK); return(OK);
} }
@ -947,6 +973,8 @@ static Status_t write_objects_inc(
/* Close the file and return */ /* Close the file and return */
fclose(fp); fclose(fp);
if(filename)
free((char*)filename);
return(OK); return(OK);
} }
@ -976,6 +1004,7 @@ static Status_t read_udn_type_name(
/* Open the file from which the node type name will be read */ /* Open the file from which the node type name will be read */
fp = fopen_cmpp(&path, "r"); fp = fopen_cmpp(&path, "r");
free((char*)path);
if(fp == NULL) if(fp == NULL)
return(ERROR); return(ERROR);

View File

@ -159,7 +159,10 @@ void preprocess_mod_file (
exit (1); exit (1);
} }
fclose (mod_yyout); fclose (mod_yyout);
mod_yyrestart(NULL); if(output_filename)
free((char*)output_filename);
rem_ifs_table(&ifs_table);
mod_yyrestart(NULL);
} }
/*---------------------------------------------------------------------------*/ /*---------------------------------------------------------------------------*/

View File

@ -150,6 +150,10 @@ static Status_t read_ifs_table(
assert (ifs_table); assert (ifs_table);
assert (fp); assert (fp);
ifs_table->name.description =
ifs_table->name.c_fcn_name =
ifs_table->name.model_name = NULL;
ifs_yylineno = 1; ifs_yylineno = 1;
ifs_yyin = fp; ifs_yyin = fp;
parser_just_names = (mode == GET_IFS_NAME) ? TRUE : FALSE; parser_just_names = (mode == GET_IFS_NAME) ? TRUE : FALSE;

View File

@ -155,7 +155,8 @@ Status_t write_ifs_c_file(
/* Close the ifspec.c file and return */ /* Close the ifspec.c file and return */
int_status = fclose(fp); int_status = fclose(fp);
if(filename)
free((char*)filename);
if(int_status == 0) if(int_status == 0)
return(OK); return(OK);
else else