BUG/MINOR: mworker: stop doing strtok directly from the env
When parsing the HAPROXY_PROCESSES environement variable, strtok was
done directly from the ptr resulting from getenv(), which replaces the ;
by \0, showing confusing environment variables when debugging in /proc
or in a corefile.
Example:
(gdb) x/39s *environ
[...]
0x7fff6935af64: "HAPROXY_PROCESSES=|type=w"
0x7fff6935af7e: "fd=3"
0x7fff6935af83: "pid=4444"
0x7fff6935af8d: "rpid=1"
0x7fff6935af94: "reloads=0"
0x7fff6935af9e: "timestamp=1676338060"
0x7fff6935afb3: "id="
0x7fff6935afb7: "version=2.4.0-8076da-1010+11"
This patch fixes the issue by doing a strdup on the variable.
Could be backported in previous versions (mworker_proc_to_env_list
exists since 1.9)
(cherry picked from commit d27f457eea470117c608bf9d1a3bd42bcdb8e5dd)
Signed-off-by: William Lallemand <wlallemand@haproxy.org>
(cherry picked from commit 607c038872777fa597613b557023b1ded45874e9)
Signed-off-by: William Lallemand <wlallemand@haproxy.org>
(cherry picked from commit 0ffcf775a55c01cb97888df04a17b7d4133e10d8)
Signed-off-by: William Lallemand <wlallemand@haproxy.org>
(cherry picked from commit 54cb7716dd1662eea4fb16096878bca687731fba)
[cf: ctx adjt]
Signed-off-by: Christopher Faulet <cfaulet@haproxy.com>
diff --git a/src/mworker.c b/src/mworker.c
index d78f4ce..a77c0a1 100644
--- a/src/mworker.c
+++ b/src/mworker.c
@@ -130,15 +130,24 @@
/*
* unserialize the proc list from the environment
+ * Return < 0 upon error.
*/
int mworker_env_to_proc_list()
{
- char *msg, *token = NULL, *s1;
+ char *env, *msg, *omsg = NULL, *token = NULL, *s1;
+ int err = 0;
- msg = getenv("HAPROXY_PROCESSES");
- if (!msg)
+ env = getenv("HAPROXY_PROCESSES");
+ if (!env)
return 0;
+ omsg = msg = strdup(env);
+ if (!msg) {
+ ha_alert("Out of memory while trying to allocate a worker process structure.");
+ err = -1;
+ goto out;
+ }
+
while ((token = strtok_r(msg, "|", &s1))) {
struct mworker_proc *child;
char *subtoken = NULL;
@@ -148,8 +157,9 @@
child = calloc(1, sizeof(*child));
if (!child) {
- ha_alert("Out of memory while trying to allocate a worker process structure.");
- return -1;
+ ha_alert("out of memory while trying to allocate a worker process structure.");
+ err = -1;
+ goto out;
}
while ((subtoken = strtok_r(token, ";", &s2))) {
@@ -198,7 +208,9 @@
unsetenv("HAPROXY_PROCESSES");
- return 0;
+out:
+ free(omsg);
+ return err;
}
/* Signal blocking and unblocking */