From 063b822bb68f84dd9729327bb1765637c25aceb4 Mon Sep 17 00:00:00 2001 From: Simon Marlow Date: Tue, 1 Dec 2009 12:28:01 +0000 Subject: [PATCH] Free full_prog_argv at exit, closing a memory leak --- includes/RtsAPI.h | 1 + rts/RtsFlags.c | 15 +++++++++++++++ rts/RtsStartup.c | 3 +++ 3 files changed, 19 insertions(+) diff --git a/includes/RtsAPI.h b/includes/RtsAPI.h index a4d210a..98bf730 100644 --- a/includes/RtsAPI.h +++ b/includes/RtsAPI.h @@ -48,6 +48,7 @@ extern void getProgArgv ( int *argc, char **argv[] ); extern void setProgArgv ( int argc, char *argv[] ); extern void getFullProgArgv ( int *argc, char **argv[] ); extern void setFullProgArgv ( int argc, char *argv[] ); +extern void freeFullProgArgv ( void ) ; #ifndef mingw32_HOST_OS extern void shutdownHaskellAndSignal (int sig); diff --git a/rts/RtsFlags.c b/rts/RtsFlags.c index a646e57..19954f8 100644 --- a/rts/RtsFlags.c +++ b/rts/RtsFlags.c @@ -1389,3 +1389,18 @@ setFullProgArgv(int argc, char *argv[]) full_prog_argv[argc] = NULL; } +void +freeFullProgArgv (void) +{ + int i; + + if (full_prog_argv != NULL) { + for (i = 0; i < full_prog_argc; i++) { + stgFree(full_prog_argv[i]); + } + stgFree(full_prog_argv); + } + + full_prog_argc = 0; + full_prog_argv = NULL; +} diff --git a/rts/RtsStartup.c b/rts/RtsStartup.c index edb8088..afa38aa 100644 --- a/rts/RtsStartup.c +++ b/rts/RtsStartup.c @@ -338,6 +338,9 @@ hs_exit_(rtsBool wait_foreign) OnExitHook(); + // Free the full argv storage + freeFullProgArgv(); + #if defined(THREADED_RTS) ioManagerDie(); #endif -- 1.7.10.4