From c5a83dbb9596c98a260af9b545fc64a57b59be60 Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Wed, 23 Apr 2014 23:20:35 -0700 Subject: [PATCH] dfa: fix memory leak reintroduced by previous patch Reported by Norihiro Tanaka in . * src/dfa.c (dfaexec): Allocate mb_match_lens and mb_follows only if not already allocated. (free_mbdata): Null out mb_match_lens to mark it as being freed. --- src/dfa.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/dfa.c b/src/dfa.c index 42a9736..5dc0f09 100644 --- a/src/dfa.c +++ b/src/dfa.c @@ -426,7 +426,8 @@ struct dfa position_set mb_follows; /* Follow set added by ANYCHAR and/or MBCSET on demand. */ int *mb_match_lens; /* Array of length reduced by ANYCHAR and/or - MBCSET. */ + MBCSET. Null if mb_follows.elems has not + been allocated. */ }; /* Some macros for user access to dfa internals. */ @@ -3245,8 +3246,11 @@ dfaexec (struct dfa *d, char const *begin, char *end, if (d->mb_cur_max > 1) { memset (&d->mbs, 0, sizeof d->mbs); - d->mb_match_lens = xnmalloc (d->nleaves, sizeof *d->mb_match_lens); - alloc_position_set (&d->mb_follows, d->nleaves); + if (! d->mb_match_lens) + { + d->mb_match_lens = xnmalloc (d->nleaves, sizeof *d->mb_match_lens); + alloc_position_set (&d->mb_follows, d->nleaves); + } } for (;;) @@ -3422,6 +3426,7 @@ free_mbdata (struct dfa *d) free (d->mbcsets); free (d->mb_follows.elems); free (d->mb_match_lens); + d->mb_match_lens = NULL; } /* Initialize the components of a dfa that the other routines don't -- 1.9.0