From: Willy Tarreau Date: Tue, 4 Jun 2019 14:43:29 +0000 (+0200) Subject: BUG/MEDIUM: vars: make the tcp/http unset-var() action support conditions X-Git-Tag: v2.0-dev6~62 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=4b7531f48b5aa66d11fcee2836c201644bfb6a71;p=thirdparty%2Fhaproxy.git BUG/MEDIUM: vars: make the tcp/http unset-var() action support conditions Patrick Hemmer reported that http-request unset-var(foo) if ... fails to parse. The reason is that it reuses the same parser as "set-var(foo)" which makes a special case of the arguments, supposed to be a sample expression for set-var, but which must not exist for unset-var. Unfortunately the parser finds "if" or "unless" and believes it's an expression. Let's simply drop the test so that the outer rule parser deals with potential extraneous keywords. This should be backported to all versions supporting unset-var(). --- diff --git a/src/vars.c b/src/vars.c index 1d83c186aa..49ff672756 100644 --- a/src/vars.c +++ b/src/vars.c @@ -697,6 +697,7 @@ static int conv_check_var(struct arg *args, struct sample_conv *conv, * the format: * * set-var() + * unset-var() * * It returns ACT_RET_PRS_ERR if fails and is filled with an error * message. Otherwise, it returns ACT_RET_PRS_OK and the variable @@ -740,10 +741,6 @@ static enum act_parse_ret parse_store(const char **args, int *arg, struct proxy /* There is no fetch method when variable is unset. Just set the right * action and return. */ if (!set_var) { - if (*args[*arg]) { - memprintf(err, "fetch method not supported"); - return ACT_RET_PRS_ERR; - } rule->action = ACT_CUSTOM; rule->action_ptr = action_clear; return ACT_RET_PRS_OK;