[master] c97c0d663 vai: Improve Flexarray foreachs (VFLA_FOREACH): NULL var after loop

Nils Goroll nils.goroll at uplex.de
Wed Jul 9 20:42:05 UTC 2025


commit c97c0d66371fa35c99b699e6840e428ccf5eb6b6
Author: Nils Goroll <nils.goroll at uplex.de>
Date:   Wed Jul 9 22:19:03 2025 +0200

    vai: Improve Flexarray foreachs (VFLA_FOREACH): NULL var after loop
    
    When the loop completes, the loop variable is now set to NULL. This allows to
    easily differentiate between a completion and a break, avoids an out-of-bounds
    value after the loop and matches the vqueue macros.

diff --git a/bin/varnishd/cache/cache.h b/bin/varnishd/cache/cache.h
index 439390065..c94615395 100644
--- a/bin/varnishd/cache/cache.h
+++ b/bin/varnishd/cache/cache.h
@@ -843,10 +843,15 @@ struct vscarab {
 		VFLA_INIT(type, name, mag, fam, cap);			\
 } while(0)
 #define VFLA_FOREACH(var, cptr, fam)						\
-	for (var = &(cptr)->fam[0]; var < &(cptr)->fam[(cptr)->used]; var++)
+	for (var = &(cptr)->fam[0];						\
+	     (var = (var < &(cptr)->fam[(cptr)->used] ? var : NULL)) != NULL;	\
+	     var++)
 // continue iterating after a break of a _FOREACH
 #define VFLA_FOREACH_RESUME(var, cptr, fam)					\
-	for (; var != NULL && var < &(cptr)->fam[(cptr)->used]; var++)
+	for (;									\
+	     var != NULL &&							\
+	       (var = (var < &(cptr)->fam[(cptr)->used] ? var : NULL)) != NULL; \
+	     var++)
 #define VFLA_GET(cptr, fam) ((cptr)->used < (cptr)->capacity ? &(cptr)->fam[(cptr)->used++] : NULL)
 // asserts sufficient capacity
 #define VFLA_ADD(cptr, fam, val) do {						\
diff --git a/bin/varnishd/cache/cache_filter.h b/bin/varnishd/cache/cache_filter.h
index d9f7141f6..60c182330 100644
--- a/bin/varnishd/cache/cache_filter.h
+++ b/bin/varnishd/cache/cache_filter.h
@@ -285,6 +285,7 @@ void vdpio_return_vscarab(const struct vdp_ctx *vdc, struct vscarab *scarab)
 	VSCARAB_CHECK_NOTNULL(scarab);
 	VSCARAB_FOREACH(v, scarab)
 		vdpio_return_lease(vdc, v->lease);
+	AZ(v);
 	VSCARAB_INIT(scarab, scarab->capacity);
 }
 


More information about the varnish-commit mailing list