From 1e20ad112fc43f3d6adb3cc26be69ebffb14e9f6 Mon Sep 17 00:00:00 2001 From: Alex Rozenman Date: Fri, 24 Jul 2009 21:04:16 +0300 Subject: [PATCH] Fix some memory leaks. * src/named-ref.c: Add a pointer check (named_ref_free). * src/scan-code.l: New function (variant_table_free). Called in code_scanner_free. * src/symlist.c: Call to named_ref_free (symbol_list_free). --- ChangeLog | 8 ++++++++ src/named-ref.c | 3 ++- src/scan-code.l | 11 +++++++++++ src/symlist.c | 9 ++++++++- 4 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3d4cf9f9..fa3e3a1e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2009-07-24 Alex Rozenman + + Fix some memory leaks. + * src/named-ref.c: Add a pointer check (named_ref_free). + * src/scan-code.l: New function (variant_table_free). Called in + code_scanner_free. + * src/symlist.c: Call to named_ref_free (symbol_list_free). + 2009-07-24 Joel E. Denny Warn about character literals not of length one. diff --git a/src/named-ref.c b/src/named-ref.c index 4388acba..41d9dc17 100644 --- a/src/named-ref.c +++ b/src/named-ref.c @@ -36,6 +36,7 @@ named_ref_new (uniqstr id, location loc) void named_ref_free (named_ref *r) { - free (r); + if (r) + free (r); } diff --git a/src/scan-code.l b/src/scan-code.l index 47cde77e..d57eafa3 100644 --- a/src/scan-code.l +++ b/src/scan-code.l @@ -350,6 +350,15 @@ variant_table_grow () return &variant_table[variant_count - 1]; } +static void +variant_table_free () +{ + if (variant_table) + free (variant_table); + variant_table = 0; + variant_table_size = variant_count = 0; +} + static char * find_prefix_end (const char *prefix, char *begin, char *end) { @@ -865,6 +874,8 @@ void code_scanner_free (void) { obstack_free (&obstack_for_string, 0); + variant_table_free (); + /* Reclaim Flex's buffers. */ yylex_destroy (); } diff --git a/src/symlist.c b/src/symlist.c index b3500d2d..1ffad2b6 100644 --- a/src/symlist.c +++ b/src/symlist.c @@ -146,7 +146,14 @@ symbol_list_prepend (symbol_list *list, symbol_list *node) void symbol_list_free (symbol_list *list) { - LIST_FREE (symbol_list, list); + symbol_list *node, *next; + for (node = list; node; node = next) + { + next = node->next; + if (node->named_ref) + named_ref_free (node->named_ref); + free (node); + } } -- 2.47.2