aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAntonio Borneo <borneo.antonio@gmail.com>2021-12-24 15:15:18 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2022-01-22 10:15:48 +0000
commit492ac453ab6b97280030fe6161dfcac3d84b36ce (patch)
tree9739745304fcca993ce9130435218c980291db07
parent1536e249f2c23399f3443f8351647ea3faa5112e (diff)
downloadriscv-openocd-492ac453ab6b97280030fe6161dfcac3d84b36ce.zip
riscv-openocd-492ac453ab6b97280030fe6161dfcac3d84b36ce.tar.gz
riscv-openocd-492ac453ab6b97280030fe6161dfcac3d84b36ce.tar.bz2
log: fix memory leak when log to file is enabled
When log to file is enabled, the file is not closed by OpenOCD at exit. This is reported by Valgrind as a memory leak that is still reachable, as the internal buffers of 'FILE *log_output' are freed by the automatic fclose() at exit. Close the log file before exit. Change-Id: Id472c0d04462035254a9b49ecb0a4037263c6f6f Signed-off-by: Antonio Borneo <borneo.antonio@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6789 Tested-by: jenkins
-rw-r--r--src/helper/log.c9
-rw-r--r--src/helper/log.h1
-rw-r--r--src/openocd.c2
3 files changed, 12 insertions, 0 deletions
diff --git a/src/helper/log.c b/src/helper/log.c
index caa0a66..6865607 100644
--- a/src/helper/log.c
+++ b/src/helper/log.c
@@ -302,6 +302,15 @@ void log_init(void)
start = last_time = timeval_ms();
}
+void log_exit(void)
+{
+ if (log_output && log_output != stderr) {
+ /* Close log file, if it was open and wasn't stderr. */
+ fclose(log_output);
+ }
+ log_output = NULL;
+}
+
int set_log_output(struct command_context *cmd_ctx, FILE *output)
{
log_output = output;
diff --git a/src/helper/log.h b/src/helper/log.h
index 621d467..f0378ae 100644
--- a/src/helper/log.h
+++ b/src/helper/log.h
@@ -72,6 +72,7 @@ __attribute__ ((format (PRINTF_ATTRIBUTE_FORMAT, 5, 6)));
* Initialize logging module. Call during program startup.
*/
void log_init(void);
+void log_exit(void);
int set_log_output(struct command_context *cmd_ctx, FILE *output);
int log_register_commands(struct command_context *cmd_ctx);
diff --git a/src/openocd.c b/src/openocd.c
index 0292ba4..3c96d32 100644
--- a/src/openocd.c
+++ b/src/openocd.c
@@ -437,6 +437,8 @@ int openocd_main(int argc, char *argv[])
rtt_exit();
free_config();
+ log_exit();
+
if (ret == ERROR_FAIL)
return EXIT_FAILURE;
else if (ret != ERROR_OK)