diff --git a/src/block_alloc.h b/src/block_alloc.h
index 3317f4150e5953f8c7d607103a2779e4e4229363..ec4c02e7efb7e1d17d983dd0c00fd6d579242786 100644
--- a/src/block_alloc.h
+++ b/src/block_alloc.h
@@ -99,10 +99,12 @@
 #endif
 
 #define WALK_NONFREE_BLOCKS(DATA, BLOCK, FCOND, CODE)	do {		\
-    struct PIKE_CONCAT(DATA,_block) * p;				\
-    for(p=PIKE_CONCAT(DATA,_blocks);p;p=p->next) {			\
+    struct PIKE_CONCAT(DATA,_block) * p, * np;				\
+    p = PIKE_CONCAT(DATA,_blocks);					\
+    while (p) {								\
 	int n = p->used;						\
 	int i;								\
+	np = p->next;							\
 	for (i = 0; n && i < (sizeof(p->x)/sizeof(struct DATA)); i++) {	\
 	    BLOCK = &p->x[i];						\
 	    if (FCOND) {						\
@@ -110,6 +112,7 @@
 		--n;							\
 	    }								\
 	}								\
+	p = np;								\
     }									\
 } while(0)