From 198604f605c8c8442a9b619ea727ab32d94c9494 Mon Sep 17 00:00:00 2001 From: rlar Date: Thu, 13 Sep 2012 21:52:03 +0200 Subject: [PATCH] define.c, plug a memleak in com_undefine() --- src/frontend/define.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/frontend/define.c b/src/frontend/define.c index ee19c247f..0b40bd97d 100644 --- a/src/frontend/define.c +++ b/src/frontend/define.c @@ -441,22 +441,35 @@ com_undefine(wordlist *wlist) return; if (*wlist->wl_word == '*') { - udfuncs = NULL; /* Be sloppy. */ + for (udf = udfuncs; udf;) { + struct udfunc *next = udf->ud_next; + cp_remkword(CT_UDFUNCS, udf->ud_name); + free_pnode(udf->ud_text); + free(udf->ud_name); + free(udf); + udf = next; + } + udfuncs = NULL; return; } for (; wlist; wlist = wlist->wl_next) { ludf = NULL; - for (udf = udfuncs; udf; udf = udf->ud_next) { + for (udf = udfuncs; udf;) { + struct udfunc *next = udf->ud_next; if (eq(wlist->wl_word, udf->ud_name)) { if (ludf) ludf->ud_next = udf->ud_next; else udfuncs = udf->ud_next; cp_remkword(CT_UDFUNCS, wlist->wl_word); + free_pnode(udf->ud_text); + free(udf->ud_name); + free(udf); } else { ludf = udf; } + udf = next; } } }