From 9b2d766e0ecb222d25a43333287835452e43f8a9 Mon Sep 17 00:00:00 2001 From: Denys Vlasenko Date: Mon, 2 Jan 2023 17:05:55 +0100 Subject: [PATCH] sed: fix double-free in FEATURE_CLEAN_UP=y configs Signed-off-by: Denys Vlasenko --- editors/sed.c | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/editors/sed.c b/editors/sed.c index 32a4b61f6..00dde60be 100644 --- a/editors/sed.c +++ b/editors/sed.c @@ -99,7 +99,7 @@ enum { struct sed_FILE { struct sed_FILE *next; /* Next (linked list, NULL terminated) */ - const char *fname; + char *fname; FILE *fp; }; @@ -188,9 +188,6 @@ static void sed_free_and_close_stuff(void) while (sed_cmd) { sed_cmd_t *sed_cmd_next = sed_cmd->next; - if (sed_cmd->sw_file) - fclose(sed_cmd->sw_file); - /* Used to free regexps, but now there is code * in get_address() which can reuse a regexp * for constructs as /regexp/cmd1;//cmd2 @@ -217,6 +214,18 @@ static void sed_free_and_close_stuff(void) if (G.current_fp) fclose(G.current_fp); + + if (G.FILE_head) { + struct sed_FILE *cur = G.FILE_head; + do { + struct sed_FILE *p; + fclose(cur->fp); + free(cur->fname); + p = cur; + cur = cur->next; + free(p); + } while (cur); + } } #else void sed_free_and_close_stuff(void);