From be476686c3c4cba725ca7c909071bc875a480015 Mon Sep 17 00:00:00 2001
From: Chris Staite <christopher.staite@menlosecurity.com>
Date: Fri, 26 Sep 2025 09:04:28 +0100
Subject: [PATCH 1/2] MINOR: backend: srv_queue helper

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 |  5 ++++-
 src/backend.c         | 17 +++++++++++------
 2 files changed, 15 insertions(+), 7 deletions(-)

diff --git a/doc/configuration.txt b/doc/configuration.txt
index 946ce8ace..62503aefb 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -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
diff --git a/src/backend.c b/src/backend.c
index bee6277a5..9b5a2fd14 100644
--- a/src/backend.c
+++ b/src/backend.c
@@ -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;
 
-- 
2.49.0

