DPDK patches and discussions
 help / color / mirror / Atom feed
* [PATCH dpdk] log: fix double free on cleanup
@ 2024-11-29 16:10 Robin Jarry
  2024-11-29 16:54 ` Stephen Hemminger
  2024-11-29 17:00 ` Stephen Hemminger
  0 siblings, 2 replies; 5+ messages in thread
From: Robin Jarry @ 2024-11-29 16:10 UTC (permalink / raw)
  To: dev, Stephen Hemminger, Bruce Richardson, Morten Brørup,
	Chengwen Feng

Fix the following crash when closing a log file after rte_eal_cleanup():

    double free or corruption (!prev)

    Thread 1 "grout" received signal SIGABRT, Aborted.
    __pthread_kill_implementation (threadid=<optimized out>,
    signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44
    ...
    #10 _IO_new_fclose (fp=0xb63090) at iofclose.c:74
    #11 0x000000000049c04e in dpdk_fini () at ../main/dpdk.c:204
    #12 0x0000000000402ab8 in main (...) at ../main/main.c:217
    (gdb) up 11
    #11 0x000000000049c04e in dpdk_fini () at ../main/dpdk.c:204
    202             rte_eal_cleanup();
    203             if (log_stream != NULL)
    204                     fclose(log_stream);

When the application has passed a custom file via rte_openlog_stream()
DPDK should not call fclose() on it.

Add an internal is_internal_file field to track whether the file has
been allocated by DPDK (syslog or journald) to determine if it should be
closed or not.

Fixes: 985130369be3 ("log: rework syslog handling")
Signed-off-by: Robin Jarry <rjarry@redhat.com>
---
 lib/log/log.c | 14 ++++++++------
 1 file changed, 8 insertions(+), 6 deletions(-)

diff --git a/lib/log/log.c b/lib/log/log.c
index eb087d601e8b..e1c18a8e5351 100644
--- a/lib/log/log.c
+++ b/lib/log/log.c
@@ -38,6 +38,7 @@ static struct rte_logs {
 	uint32_t type;  /**< Bitfield with enabled logs. */
 	uint32_t level; /**< Log level. */
 	FILE *file;     /**< Output file set by rte_openlog_stream, or NULL. */
+	bool is_internal_file;
 	log_print_t print_func;
 	size_t dynamic_types_len;
 	struct rte_log_dynamic_type *dynamic_types;
@@ -80,8 +81,11 @@ static RTE_DEFINE_PER_LCORE(struct log_cur_msg, log_cur_msg);
 int
 rte_openlog_stream(FILE *f)
 {
+	if (rte_logs.is_internal_file && rte_logs.file != NULL)
+		fclose(rte_logs.file);
 	rte_logs.file = f;
 	rte_logs.print_func = vfprintf;
+	rte_logs.is_internal_file = false;
 	return 0;
 }
 
@@ -520,6 +524,7 @@ eal_log_init(const char *id)
 		/* if either syslog or journal is used, then no special handling */
 		if (logf) {
 			rte_openlog_stream(logf);
+			rte_logs.is_internal_file = true;
 		} else {
 			bool is_terminal = isatty(fileno(stderr));
 			bool use_color = log_color_enabled(is_terminal);
@@ -550,11 +555,8 @@ eal_log_init(const char *id)
 void
 rte_eal_log_cleanup(void)
 {
-	FILE *log_stream = rte_logs.file;
-
-	/* don't close stderr on the application */
-	if (log_stream != NULL)
-		fclose(log_stream);
-
+	if (rte_logs.is_internal_file && rte_logs.file != NULL)
+		fclose(rte_logs.file);
 	rte_logs.file = NULL;
+	rte_logs.is_internal_file = false;
 }
-- 
2.47.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2024-12-23  9:00 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2024-11-29 16:10 [PATCH dpdk] log: fix double free on cleanup Robin Jarry
2024-11-29 16:54 ` Stephen Hemminger
2024-12-01 13:48   ` Robin Jarry
2024-11-29 17:00 ` Stephen Hemminger
2024-12-23  8:59   ` David Marchand

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).