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);
void rem_ifs_table(Ifs_Table_t *ifs_table);
/*
* 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
@ -65,7 +70,6 @@ void preprocess_ifs_file(void)
Status_t status; /* Return status */
/* Read the entire ifspec.ifs file and load the data into 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) {
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) {
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;
*model_info = model;
if(filename)
free((char*)filename);
return(OK);
}
@ -424,6 +436,9 @@ static Status_t read_udnpath(
*num_nodes = n;
*node_info = node;
if(filename)
free((char*)filename);
return(OK);
}
@ -467,14 +482,17 @@ static Status_t read_model_names(
/* Transfer the names into the model_info structure */
if(status == OK) {
model_info[i].spice_name = ifs_table.name.model_name;
model_info[i].cfunc_name = ifs_table.name.c_fcn_name;
model_info[i].spice_name = strdup(ifs_table.name.model_name);
model_info[i].cfunc_name = strdup(ifs_table.name.c_fcn_name);
}
else {
all_found = FALSE;
print_error("ERROR - Problems reading %s in directory %s",
IFSPEC_FILENAME, model_info[i].path_name);
}
/* Remove the ifs_table */
rem_ifs_table(&ifs_table);
}
if(all_found)
@ -767,6 +785,8 @@ static Status_t write_CMextrn(
/* Close the file and return */
fclose(fp);
if(filename)
free((char*)filename);
return(OK);
}
@ -808,6 +828,8 @@ static Status_t write_CMinfo(
/* Close the file and return */
fclose(fp);
if(filename)
free((char*)filename);
return(OK);
}
@ -853,6 +875,8 @@ static Status_t write_UDNextrn(
/* Close the file and return */
fclose(fp);
if(filename)
free((char*)filename);
return(OK);
}
@ -895,6 +919,8 @@ static Status_t write_UDNinfo(
}
/* Close the file and return */
if(filename)
free((char*)filename);
fclose(fp);
return(OK);
}
@ -947,6 +973,8 @@ static Status_t write_objects_inc(
/* Close the file and return */
fclose(fp);
if(filename)
free((char*)filename);
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 */
fp = fopen_cmpp(&path, "r");
free((char*)path);
if(fp == NULL)
return(ERROR);

View File

@ -159,7 +159,10 @@ void preprocess_mod_file (
exit (1);
}
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 (fp);
ifs_table->name.description =
ifs_table->name.c_fcn_name =
ifs_table->name.model_name = NULL;
ifs_yylineno = 1;
ifs_yyin = fp;
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 */
int_status = fclose(fp);
if(filename)
free((char*)filename);
if(int_status == 0)
return(OK);
else