From: Chris Staite Date: Fri, 26 Sep 2025 08:04:28 +0000 (+0100) Subject: MINOR: backend: srv_queue helper X-Git-Tag: v3.3-dev9~32 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=faba98c85f7c90c1e1d393263ab734fb8c3525b5;p=thirdparty%2Fhaproxy.git 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. --- 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() Compares the contents of 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;