From bf9bcb0a00d7f0f2d743bc12e146dddbbb9167b7 Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 13 May 2019 10:39:36 +0200 Subject: [PATCH] MINOR: spoe: Set the argument chunk size to 0 when SPOE variables are checked 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 | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/flt_spoe.c b/src/flt_spoe.c index 82e271994..2755f3ab4 100644 --- a/src/flt_spoe.c +++ b/src/flt_spoe.c @@ -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);