From: Valentine Krasnobaeva Date: Tue, 15 Oct 2024 10:39:50 +0000 (+0200) Subject: BUG/MINOR: mworker: fix memory leak due to master-worker fork X-Git-Tag: v3.1-dev10~54 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=ae84f060253f5ab01b3b20618f575a8df162c897;p=thirdparty%2Fhaproxy.git 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(). --- diff --git a/src/haproxy.c b/src/haproxy.c index 66e2724fc5..686e16ac3a 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! */