From ae84f060253f5ab01b3b20618f575a8df162c897 Mon Sep 17 00:00:00 2001 From: Valentine Krasnobaeva Date: Tue, 15 Oct 2024 12:39:50 +0200 Subject: [PATCH] BUG/MINOR: mworker: fix memory leak due to master-worker fork Before this fix, startup logs ring was duplicated before the fork(), so master and worker had both the original startup_logs ring and the duplicated one. In the worker context we freed the original ring and used a duplicated one. In the master context we did nothing, but we still create a duplicated copy again and again during the reload. So, let's duplicate startup logs ring only in the worker context. Master continues to use the original ring initialized in init() before its fork(). --- src/haproxy.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/haproxy.c b/src/haproxy.c index 66e2724fc..686e16ac3 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -2151,8 +2151,6 @@ static void init(int argc, char **argv) struct mworker_proc *child; struct ring *tmp_startup_logs = NULL; - /* at this point the worker must have his own startup_logs buffer */ - tmp_startup_logs = startup_logs_dup(startup_logs); worker_pid = fork(); switch (worker_pid) { case -1: @@ -2160,7 +2158,11 @@ static void init(int argc, char **argv) exit(EXIT_FAILURE); case 0: - /* in child */ + /* in child: at this point the worker must have his own startup_logs buffer */ + tmp_startup_logs = startup_logs_dup(startup_logs); + if (tmp_startup_logs == NULL) + exit(EXIT_FAILURE); + startup_logs_free(startup_logs); startup_logs = tmp_startup_logs; /* This one must not be exported, it's internal! */