diff --git a/CHANGES.current b/CHANGES.current index edef80385..91ece6ac0 100644 --- a/CHANGES.current +++ b/CHANGES.current @@ -1,6 +1,10 @@ Version 1.3.35 (in progress) ============================ +03/17/2008: olly + Fix memory leak in SWIG's parser (based on patch from Russell + Bryant in SF#1914023).` + 03/12/2008: wsfulton Fix bug #1878285 - unnecessary cast for C struct creation wrappers. diff --git a/Source/Preprocessor/expr.c b/Source/Preprocessor/expr.c index 6113851b9..4da24a774 100644 --- a/Source/Preprocessor/expr.c +++ b/Source/Preprocessor/expr.c @@ -226,7 +226,6 @@ void Preprocessor_expr_init(void) { } void Preprocessor_expr_delete(void) { - Scanner_clear(scan); DelScanner(scan); } diff --git a/Source/Swig/scanner.c b/Source/Swig/scanner.c index bb2181e70..e8b1b5f46 100644 --- a/Source/Swig/scanner.c +++ b/Source/Swig/scanner.c @@ -44,7 +44,7 @@ Scanner *NewScanner() { s->nexttoken = -1; s->start_line = 1; s->yylen = 0; - s->idstart = ""; + s->idstart = NULL; s->scanobjs = NewList(); s->text = NewStringEmpty(); s->str = 0; @@ -66,6 +66,7 @@ void DelScanner(Scanner * s) { Delete(s->file); Delete(s->error); Delete(s->str); + free(s->idstart); free(s); } @@ -170,7 +171,8 @@ int Scanner_start_line(Scanner * s) { * Change the set of additional characters that can be used to start an identifier. * ----------------------------------------------------------------------------- */ -void Scanner_idstart(Scanner * s, char *id) { +void Scanner_idstart(Scanner * s, const char *id) { + free(s->idstart); s->idstart = Swig_copy_string(id); } @@ -421,7 +423,8 @@ static int look(Scanner * s) { /* Look for possible identifiers */ - else if ((isalpha(c)) || (c == '_') || (strchr(s->idstart, c))) + else if ((isalpha(c)) || (c == '_') || + (s->idstart && strchr(s->idstart, c))) state = 7; /* Look for single character symbols */ @@ -640,7 +643,8 @@ static int look(Scanner * s) { Setline(s->text, Getline(s->str)); Setfile(s->text, Getfile(s->str)); s->start_line = s->line; - } else if (strchr(s->idstart, '%') && ((isalpha(c)) || (c == '_'))) { + } else if (s->idstart && strchr(s->idstart, '%') && + ((isalpha(c)) || (c == '_'))) { state = 7; } else if (c == '=') { return SWIG_TOKEN_MODEQUAL; diff --git a/Source/Swig/swigscan.h b/Source/Swig/swigscan.h index 88ce95636..2486286a9 100644 --- a/Source/Swig/swigscan.h +++ b/Source/Swig/swigscan.h @@ -24,7 +24,7 @@ extern void Scanner_set_location(Scanner *, String *file, int line); extern String *Scanner_file(Scanner *); extern int Scanner_line(Scanner *); extern int Scanner_start_line(Scanner *); -extern void Scanner_idstart(Scanner *, char *idchar); +extern void Scanner_idstart(Scanner *, const char *idchar); extern String *Scanner_errmsg(Scanner *); extern int Scanner_errline(Scanner *); extern int Scanner_isoperator(int tokval);