From f881f98daf3a251a41e2be40035052c0392525dd Mon Sep 17 00:00:00 2001 From: Olly Betts Date: Mon, 17 Mar 2008 00:36:35 +0000 Subject: [PATCH] Fix memory leak in SWIG's parser (based on patch from Russell Bryant in SF#1914023).` git-svn-id: https://swig.svn.sourceforge.net/svnroot/swig/trunk@10310 626c5289-ae23-0410-ae9c-e8d60b6d4f22 --- CHANGES.current | 4 ++++ Source/Preprocessor/expr.c | 1 - Source/Swig/scanner.c | 12 ++++++++---- Source/Swig/swigscan.h | 2 +- 4 files changed, 13 insertions(+), 6 deletions(-) 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);