[master] d99d2ad1e fix backend.list x.y when labels are in use

Nils Goroll nils.goroll at uplex.de
Mon Sep 15 09:00:05 UTC 2025


commit d99d2ad1ed99943e0a987194aa1612c02175e3c8
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Mon Sep 15 10:05:33 2025 +0200

    fix backend.list x.y when labels are in use
    
    labels are struct vcl objects for which most members are empty/null, with the
    label member pointing to the labeled vcl.
    
    As such, label vcl objects also have no vdire struct. Hence, when iterating over
    VCLs to find backends, labels need to be skipped.

diff --git a/bin/varnishd/cache/cache_vcl.c b/bin/varnishd/cache/cache_vcl.c
index aa81c95f2..84980003b 100644
--- a/bin/varnishd/cache/cache_vcl.c
+++ b/bin/varnishd/cache/cache_vcl.c
@@ -530,6 +530,8 @@ vcl_iterdir(struct cli *cli, const char *pat, const struct vcl *vcl,
 	int i, found = 0;
 	struct vcldir *vdir;
 
+	AN(vcl->vdire);	// no labels
+
 	Lck_AssertHeld(&vcl_mtx);
 	VTAILQ_FOREACH(vdir, &vcl->vdire->directors, directors_list) {
 		CHECK_OBJ(vdir, VCLDIR_MAGIC);
@@ -575,6 +577,9 @@ VCL_IterDirector(struct cli *cli, const char *pat,
 	} else {
 		Lck_Lock(&vcl_mtx);
 		VTAILQ_FOREACH(vcl, &vcl_head, list) {
+			// skip labels
+			if (! vcl->vdire)
+				continue;
 			i = vcl_iterdir(cli, VSB_data(vsb), vcl, func, priv);
 			if (i < 0) {
 				found = i;
diff --git a/bin/varnishtest/tests/c00077.vtc b/bin/varnishtest/tests/c00077.vtc
index ececd1519..d360b78b1 100644
--- a/bin/varnishtest/tests/c00077.vtc
+++ b/bin/varnishtest/tests/c00077.vtc
@@ -15,6 +15,7 @@ varnish v1 -clierr 106 "vcl.label vcl.A vcl1"
 varnish v1 -cliok "vcl.label vclA vcl1"
 # labeling twice #2834
 varnish v1 -cliok "vcl.label vclA vcl1"
+varnish v1 -cliok "backend.list vcl1.*"
 
 varnish v1 -vcl+backend {
 	sub vcl_recv {


More information about the varnish-commit mailing list