This was found by reading the code while investigating issue #96 and not verified with any tools:
If `child->pid` is falsy `child` will be freed instead of being added to `proc_list`. The setting of `PROC_O_LEAVING` happens unconditionally after this check. Fix the issue by mising the setting of the LEAVING option right behind the allocation of `child`. This bug was introduced in 4528611ed66d8bfa344782f6c7f1e7151cf48bf5, which is specific to the 2.0-dev branch. No backport required. --- src/mworker.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/mworker.c b/src/mworker.c index 8df748d3f..491d40837 100644 --- a/src/mworker.c +++ b/src/mworker.c @@ -147,6 +147,9 @@ void mworker_env_to_proc_list() child = calloc(1, sizeof(*child)); + /* this is a process inherited from a reload that should be leaving */ + child->options |= PROC_O_LEAVING; + while ((subtoken = strtok_r(token, ";", &s2))) { token = NULL; @@ -184,10 +187,7 @@ void mworker_env_to_proc_list() } else { free(child->id); free(child); - } - /* this is a process inherited from a reload that should be leaving */ - child->options |= PROC_O_LEAVING; } unsetenv("HAPROXY_PROCESSES"); -- 2.21.0