From 5acd7854cc54ae583e48de029d5e20dc4ab3154b Mon Sep 17 00:00:00 2001 From: Augustin Fabre Date: Tue, 31 Mar 2020 22:50:53 +0200 Subject: [PATCH] Fix memory leak in gophermap parsing FILE pointer `fp' was not closed when the gophermap parsing returned early. --- Makefile | 2 +- src/menu.c | 14 ++++++++++---- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/Makefile b/Makefile index de0c60a..8545416 100644 --- a/Makefile +++ b/Makefile @@ -72,7 +72,7 @@ src/functions.h: grep -h "^[a-z]" $(SOURCES) | \ grep -v "int main" | \ grep -v "strlc" | \ - grep -v "[a-z]:" | \ + grep -vi "[a-z]:" | \ sed -e "s/ =.*$$//" -e "s/ *$$/;/" >> $@ @echo diff --git a/src/menu.c b/src/menu.c index 9e25716..083d352 100644 --- a/src/menu.c +++ b/src/menu.c @@ -283,6 +283,7 @@ int gophermap(state *st, char *mapfile, int depth) char type; int port; int exe; + int return_val = QUIT; /* Prevent include loops */ if (depth > 4) return OK; @@ -343,8 +344,13 @@ int gophermap(state *st, char *mapfile, int depth) if (type == '#') continue; /* Stop handling gophermap? */ - if (type == '*') return OK; - if (type == '.') return QUIT; + if (type == '*') { + return_val = OK; + goto CLOSE_FP; + } + if (type == '.') + goto CLOSE_FP; + /* Print a list of users with public_gopher */ if (type == '~' && st->opt_personal_spaces) { @@ -435,14 +441,14 @@ int gophermap(state *st, char *mapfile, int depth) } } - /* Clean up & return */ +CLOSE_FP: #ifdef HAVE_POPEN if (exe & st->opt_exec) pclose(fp); else #endif fclose(fp); - return QUIT; + return return_val; }