From 44ac2cdb4dc8481cff33101f95f94761c5aa74bc Mon Sep 17 00:00:00 2001 From: Paul Smith Date: Sat, 26 Sep 2009 23:01:55 +0000 Subject: [PATCH] Fix some memory leaks, found with valgrind. --- ChangeLog | 6 ++++++ function.c | 1 + read.c | 21 ++++++++++++++++----- 3 files changed, 23 insertions(+), 5 deletions(-) diff --git a/ChangeLog b/ChangeLog index 545ea53c..66ce7f3c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2009-09-26 Paul Smith + + * read.c (record_files): Free FILENAMES chain for implicit rules. + + * function.c (string_glob): Free NAME in the nameseq chain. + 2009-09-25 Boris Kolpackov * implicit.c (pattern_search): Terminate early if we haven't diff --git a/function.c b/function.c index a2adc315..d3acd8b6 100644 --- a/function.c +++ b/function.c @@ -382,6 +382,7 @@ string_glob (char *line) idx += len; result[idx++] = ' '; + free (chain->name); free (chain); chain = next; } diff --git a/read.c b/read.c index 87bb046a..55b26e8c 100644 --- a/read.c +++ b/read.c @@ -566,8 +566,8 @@ eval (struct ebuffer *ebuf, int set_default) record_files (filenames, pattern, pattern_percent, depstr, \ cmds_started, commands, commands_idx, two_colon, \ &fi); \ + filenames = 0; \ } \ - filenames = 0; \ commands_idx = 0; \ no_targets = 0; \ pattern = 0; \ @@ -1935,8 +1935,13 @@ record_files (struct nameseq *filenames, const char *pattern, if (pattern != 0) fatal (flocp, _("mixed implicit and static pattern rules")); - /* Create an array of target names */ - for (c = 1, nextf = filenames->next; nextf; ++c, nextf = nextf->next) + /* Count the targets to create an array of target names. + We already have the first one. */ + nextf = filenames->next; + free (filenames); + filenames = nextf; + + for (c = 1; nextf; ++c, nextf = nextf->next) ; targets = xmalloc (c * sizeof (const char *)); target_pats = xmalloc (c * sizeof (const char *)); @@ -1944,9 +1949,10 @@ record_files (struct nameseq *filenames, const char *pattern, targets[0] = name; target_pats[0] = implicit_percent; - for (c = 1, nextf = filenames->next; nextf; ++c, nextf = nextf->next) + c = 1; + while (filenames) { - name = nextf->name; + name = filenames->name; implicit_percent = find_percent_cached (&name); if (implicit_percent == 0) @@ -1954,6 +1960,11 @@ record_files (struct nameseq *filenames, const char *pattern, targets[c] = name; target_pats[c] = implicit_percent; + ++c; + + nextf = filenames->next; + free (filenames); + filenames = nextf; } create_pattern_rule (targets, target_pats, c, two_colon, deps, cmds, 1);