summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/common/container.h10
-rw-r--r--src/or/circuitbuild.c3
2 files changed, 11 insertions, 2 deletions
diff --git a/src/common/container.h b/src/common/container.h
index ff2d3cb011..fbd3c6c603 100644
--- a/src/common/container.h
+++ b/src/common/container.h
@@ -156,6 +156,16 @@ char *smartlist_join_strings2(smartlist_t *sl, const char *join,
cmd; \
} } while (0)
+/** Helper: While in a SMARTLIST_FOREACH loop over the list <b>sl</b> indexed
+ * with the variable <b>var</b>, remover the current element in a way that
+ * won't confuse the loop. */
+#define SMARTLIST_DEL_CURRENT(sl, var) \
+ do { \
+ smartlist_del(sl, var ## _sl_idx); \
+ --var ## _sl_idx; \
+ --var ## _sl_len; \
+ } while (0);
+
#define DECLARE_MAP_FNS(maptype, keytype, prefix) \
typedef struct maptype maptype; \
typedef struct prefix##entry_t *prefix##iter_t; \
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 58e85da590..fa6cd5108d 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -2280,8 +2280,7 @@ entry_guards_prepend_from_config(void)
/* Remove all currently configured entry guards from entry_routers. */
SMARTLIST_FOREACH(entry_routers, routerinfo_t *, ri, {
if (is_an_entry_guard(ri->cache_info.identity_digest)) {
- smartlist_del(entry_routers, ri_sl_idx--);
- ri_sl_len--;
+ SMARTLIST_DEL_CURRENT(entry_routers, ri);
}
});