BUG/MEDIUM: spoe: Unset variable instead of set it if no data provided
authorChristopher Faulet <cfaulet@haproxy.com>
Thu, 15 Oct 2020 14:08:30 +0000 (16:08 +0200)
committerChristopher Faulet <cfaulet@haproxy.com>
Fri, 16 Oct 2020 17:53:17 +0000 (19:53 +0200)
If an agent try to set a variable with the NULL data type, an unset is perform
instead to avoid undefined behaviors. Once decoded, such data are translated to
a sample with the type SMP_T_ANY. It is unexpected in HAProxy. When a variable
is set with such sample, no data are attached to the variable. Thus, when the
variable is retrieved later in the transaction, the sample data are
uninitialized, leading to undefined behaviors depending on how it is used. For
instance, it leads to a crash if the debug converter is used on such variable.

This patch should fix the issue #855. It must be backported as far as 1.8.

src/flt_spoe.c

index 62e535e..cf5fc7a 100644 (file)
@@ -2368,7 +2368,10 @@ spoe_decode_action_set_var(struct stream *s, struct spoe_context *ctx,
                    ((struct spoe_config *)FLT_CONF(ctx->filter))->agent->var_pfx,
                    (int)sz, str);
 
-       spoe_set_var(ctx, scope, str, sz, &smp);
+       if (smp.data.type == SMP_T_ANY)
+               spoe_unset_var(ctx, scope, str, sz, &smp);
+       else
+               spoe_set_var(ctx, scope, str, sz, &smp);
 
        ret  = (p - *buf);
        *buf = p;