]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: backend: srv_queue helper
authorChris Staite <christopher.staite@menlosecurity.com>
Fri, 26 Sep 2025 08:04:28 +0000 (09:04 +0100)
committerWilly Tarreau <w@1wt.eu>
Fri, 26 Sep 2025 08:46:48 +0000 (10:46 +0200)
In preparation of providing further server converters, split the code
for finding the server from the sample out.

Additionally, update the documentation for srv_queue converter to note
security concerns.

doc/configuration.txt
src/backend.c

index 946ce8ace7bc180ad6d5600435e58248fd74ea41..62503aefbd1d3ee7b3dac9b7f15e5654c654438f 100644 (file)
@@ -21410,7 +21410,10 @@ srv_queue
   format and returns the number of queued streams on that server. Can be used
   in places where we want to look up queued streams from a dynamic name, like a
   cookie value (e.g. req.cook(SRVID),srv_queue) and then make a decision to break
-  persistence or direct a request elsewhere.
+  persistence or direct a request elsewhere. Before using this, please keep in
+  mind that using this converter on uncontrolled data might allow an external
+  observer to query the state of any server in the whole configuration, which
+  might possibly not be acceptable in some environments.
 
 strcmp(<var>)
   Compares the contents of <var> with the input value of type string. Returns
index bee6277a5ef2a61fdec91ec75be3a0b34a7e49f3..9b5a2fd14bc076a46243f13c5041b968b36c1075 100644 (file)
@@ -3738,11 +3738,9 @@ static int sample_conv_nbsrv(const struct arg *args, struct sample *smp, void *p
        return 1;
 }
 
-static int
-sample_conv_srv_queue(const struct arg *args, struct sample *smp, void *private)
+static struct server *sample_conv_srv(struct sample *smp)
 {
        struct proxy *px;
-       struct server *srv;
        char *bksep;
 
        if (!smp_make_safe(smp))
@@ -3754,15 +3752,22 @@ sample_conv_srv_queue(const struct arg *args, struct sample *smp, void *private)
                *bksep = '\0';
                px = proxy_find_by_name(smp->data.u.str.area, PR_CAP_BE, 0);
                if (!px)
-                       return 0;
+                       return NULL;
                smp->data.u.str.area = bksep + 1;
        } else {
                if (!(smp->px->cap & PR_CAP_BE))
-                       return 0;
+                       return NULL;
                px = smp->px;
        }
 
-       srv = server_find(px, smp->data.u.str.area);
+       return server_find(px, smp->data.u.str.area);
+}
+
+static int
+sample_conv_srv_queue(const struct arg *args, struct sample *smp, void *private)
+{
+       struct server *srv = sample_conv_srv(smp);
+
        if (!srv)
                return 0;