Browse Source

bug fix, copys not always valid

rlar 14 years ago
parent
commit
d2f2456ce7
  1. 9
      ChangeLog
  2. 47
      src/frontend/inpcom.c

9
ChangeLog

@ -1,5 +1,12 @@
2011-12-30 Robert Larice
* inpcom.c :
bug fix, copys not always valid
cleanup scope, emphasize live range
avoid things to be freed too early
avoid incorrect frees
2011-12-30 Holger Vogt 2011-12-30 Holger Vogt
* inpcom.c: remove a bug reading a file
* inpcom.c: remove a bug reading a file
(FIXME: .inc and .lib need some general overhauling!) (FIXME: .inc and .lib need some general overhauling!)
2011-12-30 Robert Larice 2011-12-30 Robert Larice

47
src/frontend/inpcom.c

@ -144,7 +144,7 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
char ipc_buffer[1025]; /* Had better be big enough */ char ipc_buffer[1025]; /* Had better be big enough */
int ipc_len; int ipc_len;
#endif #endif
char *copys=NULL, big_buff2[5000];
char big_buff2[5000];
char *new_title = NULL; char *new_title = NULL;
char keep_char; char keep_char;
int line_number = 1; /* sjb - renamed to avoid confusion with struct line */ int line_number = 1; /* sjb - renamed to avoid confusion with struct line */
@ -267,6 +267,9 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
// check if rest of line commented out // check if rest of line commented out
if ( *y && *y != '$' ) { /* .lib <file name> <lib name> */ if ( *y && *y != '$' ) { /* .lib <file name> <lib name> */
char *copys = NULL;
for ( z = y; *z && !isspace(*z) && !isquote(*z); z++ ) for ( z = y; *z && !isspace(*z) && !isquote(*z); z++ )
; ;
c = *t; c = *t;
@ -275,9 +278,8 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
if ( *s == '~' ) { if ( *s == '~' ) {
copys = cp_tildexpand(s); /* allocates memory, but can also return NULL */ copys = cp_tildexpand(s); /* allocates memory, but can also return NULL */
if( copys != NULL ) {
if ( copys )
s = copys; /* reuse s, but remember, buffer still points to allocated memory */ s = copys; /* reuse s, but remember, buffer still points to allocated memory */
}
} }
/* lower case the file name for later string compares */ /* lower case the file name for later string compares */
s_lower = strdup(s); s_lower = strdup(s);
@ -291,22 +293,22 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
break; break;
} }
} }
if ( found_library ) {
if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */
} else {
if ( !found_library ) {
if ( dir_name != NULL ) sprintf( big_buff2, "%s/%s", dir_name, s ); if ( dir_name != NULL ) sprintf( big_buff2, "%s/%s", dir_name, s );
else sprintf( big_buff2, "./%s", s ); else sprintf( big_buff2, "./%s", s );
dir_name_flag = FALSE; dir_name_flag = FALSE;
if ((newfp = inp_pathopen( s, "r" )) == NULL) { if ((newfp = inp_pathopen( s, "r" )) == NULL) {
dir_name_flag = TRUE; dir_name_flag = TRUE;
if ((newfp = inp_pathopen( big_buff2, "r" )) == NULL ) { if ((newfp = inp_pathopen( big_buff2, "r" )) == NULL ) {
if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */
if ( copys )
tfree(copys); /* allocated by the cp_tildexpand() above */
fprintf(cp_err, "Error: Could not find library file %s\n", s); fprintf(cp_err, "Error: Could not find library file %s\n", s);
tfree(buffer); tfree(buffer);
controlled_exit(EXIT_FAILURE); controlled_exit(EXIT_FAILURE);
} }
} }
if(copys) tfree(copys); /* allocated by the cp_tildexpand() above */
library_file[num_libraries++] = strdup(s_lower); library_file[num_libraries++] = strdup(s_lower);
@ -319,9 +321,13 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
fclose(newfp); fclose(newfp);
} }
*t = c; *t = c;
tfree(s_lower); tfree(s_lower);
if ( copys )
tfree(copys); /* allocated by the cp_tildexpand() above */
/* Make the .lib a comment */ /* Make the .lib a comment */
*buffer = '*'; *buffer = '*';
} else { /* no lib name given */ } else { /* no lib name given */
@ -334,6 +340,9 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
/* now handle .include statements */ /* now handle .include statements */
if (ciprefix(".include", buffer) || ciprefix(".inc", buffer)) { if (ciprefix(".include", buffer) || ciprefix(".inc", buffer)) {
char *copys = NULL;
inp_stripcomments_line(buffer); inp_stripcomments_line(buffer);
for (s = buffer; *s && !isspace(*s); s++) /* advance past non-space chars */ for (s = buffer; *s && !isspace(*s); s++) /* advance past non-space chars */
; ;
@ -360,9 +369,8 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
if (*s == '~') { if (*s == '~') {
copys = cp_tildexpand(s); /* allocates memory, but can also return NULL */ copys = cp_tildexpand(s); /* allocates memory, but can also return NULL */
if(copys != NULL) {
if ( copys )
s = copys; /* reuse s, but remember, buffer still points to allocated memory */ s = copys; /* reuse s, but remember, buffer still points to allocated memory */
}
} }
/* open file specified by .include statement */ /* open file specified by .include statement */
@ -373,19 +381,14 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
dir_name_flag = TRUE; dir_name_flag = TRUE;
if ((newfp = inp_pathopen( big_buff2, "r" )) == NULL ) { if ((newfp = inp_pathopen( big_buff2, "r" )) == NULL ) {
perror(s); perror(s);
if(copys) {
if ( copys )
tfree(copys); /* allocated by the cp_tildexpand() above */ tfree(copys); /* allocated by the cp_tildexpand() above */
}
fprintf(cp_err, "Error: .include statement failed.\n"); fprintf(cp_err, "Error: .include statement failed.\n");
tfree(buffer); /* allocated by readline() above */ tfree(buffer); /* allocated by readline() above */
controlled_exit(EXIT_FAILURE); controlled_exit(EXIT_FAILURE);
} }
} }
if(copys) {
tfree(copys); /* allocated by the cp_tildexpand() above */
}
if ( dir_name_flag == FALSE ) { if ( dir_name_flag == FALSE ) {
char *s_dup = strdup(s); char *s_dup = strdup(s);
inp_readall(newfp, &newcard, call_depth+1, ngdirname(s_dup), FALSE); /* read stuff in include file into netlist */ inp_readall(newfp, &newcard, call_depth+1, ngdirname(s_dup), FALSE); /* read stuff in include file into netlist */
@ -395,6 +398,9 @@ inp_readall(FILE *fp, struct line **data, int call_depth, char *dir_name, bool c
(void) fclose(newfp); (void) fclose(newfp);
if ( copys )
tfree(copys); /* allocated by the cp_tildexpand() above */
/* Make the .include a comment */ /* Make the .include a comment */
*buffer = '*'; *buffer = '*';
@ -2129,7 +2135,7 @@ static void
inp_determine_libraries( struct line *deck, char *lib_name ) inp_determine_libraries( struct line *deck, char *lib_name )
{ {
struct line *c = deck; struct line *c = deck;
char *line, *s, *t, *y, *z, *copys, keep_char1, keep_char2;
char *line, *s, *t, *y, *z, keep_char1, keep_char2;
int i, j; int i, j;
bool found_lib_name = FALSE; bool found_lib_name = FALSE;
bool read_line = FALSE; bool read_line = FALSE;
@ -2160,6 +2166,9 @@ inp_determine_libraries( struct line *deck, char *lib_name )
} }
/* .lib <file name> <lib name> */ /* .lib <file name> <lib name> */
else if ( read_line == TRUE ) { else if ( read_line == TRUE ) {
char *copys = NULL;
for ( z = y; *z && !isspace(*z) && !isquote(*z); z++ ) for ( z = y; *z && !isspace(*z) && !isquote(*z); z++ )
; ;
keep_char1 = *t; keep_char1 = *t;
@ -2169,9 +2178,8 @@ inp_determine_libraries( struct line *deck, char *lib_name )
if ( *s == '~' ) { if ( *s == '~' ) {
copys = cp_tildexpand(s); copys = cp_tildexpand(s);
if ( copys != NULL ) {
if ( copys )
s = copys; s = copys;
}
} }
for ( i = 0; i < num_libraries; i++ ) for ( i = 0; i < num_libraries; i++ )
if ( strcmp( library_file[i], s ) == 0 ) { if ( strcmp( library_file[i], s ) == 0 ) {
@ -2189,6 +2197,7 @@ inp_determine_libraries( struct line *deck, char *lib_name )
*line = '*'; /* comment out .lib line */ *line = '*'; /* comment out .lib line */
*t = keep_char1; *t = keep_char1;
*z = keep_char2; *z = keep_char2;
/* FIXME, copys not freed ?! */
} }
} }
c = c->li_next; c = c->li_next;

Loading…
Cancel
Save