From: Willy Tarreau Date: Wed, 8 Sep 2021 09:07:32 +0000 (+0200) Subject: MINOR: vars: store flags into variables and add VF_PERMANENT X-Git-Tag: v2.5-dev7~28 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3dc6dc3178a7ea61eacf11a31541cfdb22321174;p=thirdparty%2Fhaproxy.git MINOR: vars: store flags into variables and add VF_PERMANENT In order to continue to honor the ifexist Lua option and prevent rogue SPOA agents from creating too many variables, we'll need to keep the ability to mark certain proc.* variables as permanent when they're known from the config file. Let's add a flag there for this. It's added to the variable when the variable is created with this flag set by the caller. Another approach could have been to use a distinct list or distinct scope but that sounds complicated and bug-prone. --- diff --git a/include/haproxy/vars-t.h b/include/haproxy/vars-t.h index 06f2712e12..ab83b4ebee 100644 --- a/include/haproxy/vars-t.h +++ b/include/haproxy/vars-t.h @@ -28,6 +28,7 @@ /* flags used when setting/clearing variables */ #define VF_UPDATEONLY 0x00000001 // SCOPE_PROC variables are only updated #define VF_CREATEONLY 0x00000002 // do nothing if the variable already exists +#define VF_PERMANENT 0x00000004 // variables known to the config parser enum vars_scope { SCOPE_SESS = 0, @@ -54,6 +55,8 @@ struct var_desc { struct var { struct list l; /* Used for chaining vars. */ const char *name; /* Contains the variable name. */ + uint flags; // VF_* + /* 32-bit hole here */ struct sample_data data; /* data storage. */ }; diff --git a/src/vars.c b/src/vars.c index 52f19c560c..30aff97e8a 100644 --- a/src/vars.c +++ b/src/vars.c @@ -357,6 +357,7 @@ static int smp_fetch_var(const struct arg *args, struct sample *smp, const char * - VF_UPDATEONLY: if the scope is SCOPE_PROC, the variable may only be * updated but not created. * - VF_CREATEONLY: do nothing if the variable already exists (success). + * - VF_PERMANENT: this flag will be passed to the variable upon creation * * It returns 0 on failure, non-zero on success. */ @@ -408,6 +409,7 @@ static int var_set(const char *name, enum vars_scope scope, struct sample *smp, goto unlock; LIST_APPEND(&vars->head, &var->l); var->name = name; + var->flags = flags & VF_PERMANENT; } /* Set type. */