Previously an expression like:

    path,field(2,/) -m found

always returned `true`.

Bug exists since the `field` converter exists. That is:
f399b0debfc6c7dc17c6ad503885c911493add56

The fix should be backported to 1.6+.
---
 reg-tests/converter/field.vtc | 39 +++++++++++++++++++++++++++++++++++
 src/sample.c                  |  2 +-
 2 files changed, 40 insertions(+), 1 deletion(-)
 create mode 100644 reg-tests/converter/field.vtc

diff --git a/reg-tests/converter/field.vtc b/reg-tests/converter/field.vtc
new file mode 100644
index 000000000..29608fe5b
--- /dev/null
+++ b/reg-tests/converter/field.vtc
@@ -0,0 +1,39 @@
+varnishtest "field converter Test"
+
+feature ignore_unknown_macro
+
+server s1 {
+       rxreq
+       txresp
+} -repeat 3 -start
+
+haproxy h1 -conf {
+    defaults
+       mode http
+       timeout connect 1s
+       timeout client  1s
+       timeout server  1s
+
+    frontend fe
+       bind "fd@${fe}"
+
+       #### requests
+       http-request set-var(txn.uri) path
+       http-response set-header Found %[var(txn.uri),field(3,/)] if { 
var(txn.uri),field(3,/) -m found }
+
+       default_backend be
+
+    backend be
+       server s1 ${s1_addr}:${s1_port}
+} -start
+
+client c1 -connect ${h1_fe_sock} {
+       txreq -url "/foo/bar/baz"
+       rxresp
+       expect resp.status == 200
+       expect resp.http.found == "bar"
+       txreq -url "/foo"
+       rxresp
+       expect resp.status == 200
+       expect resp.http.found == "<undef>"
+} -run
diff --git a/src/sample.c b/src/sample.c
index e2d96904e..98b5d573f 100644
--- a/src/sample.c
+++ b/src/sample.c
@@ -2137,7 +2137,7 @@ static int sample_conv_field(const struct arg *arg_p, 
struct sample *smp, void *
        /* Field not found */
        if (field != arg_p[0].data.sint) {
                smp->data.u.str.data = 0;
-               return 1;
+               return 0;
        }
 found:
        smp->data.u.str.data = end - start;
-- 
2.23.0


Reply via email to