From: Christopher Faulet Date: Fri, 13 Nov 2020 12:41:04 +0000 (+0100) Subject: BUG/MINOR: http-fetch: Fix calls w/o parentheses of the cookie sample fetches X-Git-Tag: v2.1.11~57 X-Git-Url: http://git.haproxy.org/?a=commitdiff_plain;h=8e47c2590f8a72cc31ff5af747fcf3dc000f3397;p=haproxy-2.1.git BUG/MINOR: http-fetch: Fix calls w/o parentheses of the cookie sample fetches req.cook, req.cook_val, req.cook_cnt and and their response counterparts may be called without cookie name. In this case, empty parentheses may be used, or no parentheses at all. In both, the result must be the same. But only the first one works. The second one always returns a failure. This patch fixes this bug. Note that on old versions (< 2.2), both cases fail. This patch must be backported in all stable versions. (cherry picked from commit 97fc8da2643531ade4163d6662f13f76fa59d677) Signed-off-by: Christopher Faulet (cherry picked from commit 934630a682fc4b5fb4902c254de17fcbe2ac84ee) Signed-off-by: Christopher Faulet (cherry picked from commit d6e7b958dfde326932e63a5840e4f2623fb76505) Signed-off-by: Christopher Faulet --- diff --git a/src/http_fetch.c b/src/http_fetch.c index bb4a229..22e6abd 100644 --- a/src/http_fetch.c +++ b/src/http_fetch.c @@ -1540,10 +1540,14 @@ static int smp_fetch_cookie(const struct arg *args, struct sample *smp, const ch struct htx *htx = smp_prefetch_htx(smp, chn, 1); struct http_hdr_ctx *ctx = smp->ctx.a[2]; struct ist hdr; + char *cook = NULL; + size_t cook_l = 0; int found = 0; - if (!args || args->type != ARGT_STR) - return 0; + if (args && args->type == ARGT_STR) { + cook = args->data.str.area; + cook_l = args->data.str.data; + } if (!ctx) { /* first call */ @@ -1577,7 +1581,7 @@ static int smp_fetch_cookie(const struct arg *args, struct sample *smp, const ch if (!http_find_header(htx, hdr, ctx, 0)) goto out; - if (ctx->value.len < args->data.str.data + 1) + if (ctx->value.len < cook_l + 1) continue; smp->ctx.a[0] = ctx->value.ptr; @@ -1587,7 +1591,7 @@ static int smp_fetch_cookie(const struct arg *args, struct sample *smp, const ch smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; smp->ctx.a[0] = http_extract_cookie_value(smp->ctx.a[0], smp->ctx.a[1], - args->data.str.area, args->data.str.data, + cook, cook_l, (smp->opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ, &smp->data.u.str.area, &smp->data.u.str.data); @@ -1637,10 +1641,14 @@ static int smp_fetch_cookie_cnt(const struct arg *args, struct sample *smp, cons struct http_hdr_ctx ctx; struct ist hdr; char *val_beg, *val_end; + char *cook = NULL; + size_t cook_l = 0; int cnt; - if (!args || args->type != ARGT_STR) - return 0; + if (args && args->type == ARGT_STR){ + cook = args->data.str.area; + cook_l = args->data.str.data; + } if (!htx) return 0; @@ -1656,7 +1664,7 @@ static int smp_fetch_cookie_cnt(const struct arg *args, struct sample *smp, cons if (!http_find_header(htx, hdr, &ctx, 0)) break; - if (ctx.value.len < args->data.str.data + 1) + if (ctx.value.len < cook_l + 1) continue; val_beg = ctx.value.ptr; @@ -1666,7 +1674,7 @@ static int smp_fetch_cookie_cnt(const struct arg *args, struct sample *smp, cons smp->data.type = SMP_T_STR; smp->flags |= SMP_F_CONST; while ((val_beg = http_extract_cookie_value(val_beg, val_end, - args->data.str.area, args->data.str.data, + cook, cook_l, (smp->opt & SMP_OPT_DIR) == SMP_OPT_DIR_REQ, &smp->data.u.str.area, &smp->data.u.str.data))) {