From 0e2cf434cae546fd20073f3999ed5a195f54503d Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Mon, 29 Mar 2021 11:09:45 +0200 Subject: [PATCH] BUG/MINOR: payload: Wait for more data if buffer is empty in payload/payload_lv In payload() and payload_lv() sample fetches, if the buffer is empty, we must wait for more data by setting SMP_F_MAY_CHANGE flag on the sample. Otherwise, when it happens in an ACL, nothing is returned (because the buffer is empty) and the ACL is considered as finished (success or failure depending on the test). As a workaround, the buffer length may be tested first. For instance : tcp-request inspect-delay 1s tcp-request content reject unless { req.len gt 0 } { req.payload(0,0),fix_is_valid } instead of : tcp-request inspect-delay 1s tcp-request content reject if ! { req.payload(0,0),fix_is_valid } This patch must be backported as far as 2.2. (cherry picked from commit 50623029f8171f7f499529f8002d3093fca12667) Signed-off-by: Willy Tarreau --- src/payload.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/payload.c b/src/payload.c index f867541..26994cf 100644 --- a/src/payload.c +++ b/src/payload.c @@ -984,7 +984,7 @@ smp_fetch_payload_lv(const struct arg *arg_p, struct sample *smp, const char *kw } max = global.tune.bufsize; if (!head) - return 0; + goto too_short; if (len_offset + len_size > data) goto too_short; @@ -1046,7 +1046,7 @@ smp_fetch_payload(const struct arg *arg_p, struct sample *smp, const char *kw, v } max = global.tune.bufsize; if (!head) - return 0; + goto too_short; if (buf_size > max || buf_offset + buf_size > max) { /* will never match */ -- 1.7.10.4