]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: spoe: Set the argument chunk size to 0 when SPOE variables are checked
authorChristopher Faulet <cfaulet@haproxy.com>
Mon, 13 May 2019 08:39:36 +0000 (10:39 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Mon, 13 May 2019 09:07:00 +0000 (11:07 +0200)
When SPOE variables are registered during HAProxy startup, the argument used to
call the function vars_check_arg() uses the trash area. To be sure it is never
released by the callee function, the size of the internal chunk (arg.data.str)
is set to 0. It is important to do so because, to fix a memory leak, this buffer
must be released by the function vars_check_arg().

This patch must be backported to 1.9.

src/flt_spoe.c

index 82e2719941060b7b3e3963a85664f7415c53ecd5..2755f3ab4202069b26b9febf79ffcf23bfe549a7 100644 (file)
@@ -4173,6 +4173,7 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px,
                arg.type = ARGT_STR;
                arg.data.str.area = trash.area;
                arg.data.str.data = trash.data;
+               arg.data.str.size = 0; /* Set it to 0 to not release it in vars_check_args() */
                if (!vars_check_arg(&arg, err)) {
                        memprintf(err, "SPOE agent '%s': failed to register variable %s.%s (%s)",
                                  curagent->id, curagent->var_pfx, curagent->var_on_error, *err);
@@ -4189,6 +4190,7 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px,
                arg.type = ARGT_STR;
                arg.data.str.area = trash.area;
                arg.data.str.data = trash.data;
+               arg.data.str.size = 0;  /* Set it to 0 to not release it in vars_check_args() */
                if (!vars_check_arg(&arg, err)) {
                        memprintf(err, "SPOE agent '%s': failed to register variable %s.%s (%s)",
                                  curagent->id, curagent->var_pfx, curagent->var_t_process, *err);
@@ -4205,6 +4207,7 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px,
                arg.type = ARGT_STR;
                arg.data.str.area = trash.area;
                arg.data.str.data = trash.data;
+               arg.data.str.size = 0;  /* Set it to 0 to not release it in vars_check_args() */
                if (!vars_check_arg(&arg, err)) {
                        memprintf(err, "SPOE agent '%s': failed to register variable %s.%s (%s)",
                                  curagent->id, curagent->var_pfx, curagent->var_t_process, *err);
@@ -4410,6 +4413,7 @@ parse_spoe_flt(char **args, int *cur_arg, struct proxy *px,
                arg.type = ARGT_STR;
                arg.data.str.area = trash.area;
                arg.data.str.data = trash.data;
+               arg.data.str.size = 0;  /* Set it to 0 to not release it in vars_check_args() */
                if (!vars_check_arg(&arg, err)) {
                        memprintf(err, "SPOE agent '%s': failed to register variable %s.%s (%s)",
                                  curagent->id, curagent->var_pfx, vph->name, *err);