From: David Lamparter Date: Sat, 5 Mar 2022 18:39:53 +0000 (+0100) Subject: lib: fix log target removal when singlethreaded X-Git-Tag: pim6-testing-20220430~244^2~6 X-Git-Url: https://git.puffer.fish/?a=commitdiff_plain;h=d03440cab78605dcc21427127afdf78860d9916b;p=matthieu%2Ffrr.git lib: fix log target removal when singlethreaded While running singlethreaded, the RCU code is "dormant" and rcu_free is an immediate operation. This results in the log target loop accessing free'd memory if a log target removes itself while a message is printed (which is likely to happen on e.g. error conditions.) Just use frr_each_safe to avoid this issue. Signed-off-by: David Lamparter --- diff --git a/lib/zlog.c b/lib/zlog.c index 85606d2624..e0bb34a258 100644 --- a/lib/zlog.c +++ b/lib/zlog.c @@ -401,7 +401,7 @@ void zlog_tls_buffer_flush(void) return; rcu_read_lock(); - frr_each (zlog_targets, &zlog_targets, zt) { + frr_each_safe (zlog_targets, &zlog_targets, zt) { if (!zt->logfn) continue; @@ -431,7 +431,7 @@ static void vzlog_notls(const struct xref_logmsg *xref, int prio, msg->stackbufsz = sizeof(stackbuf); rcu_read_lock(); - frr_each (zlog_targets, &zlog_targets, zt) { + frr_each_safe (zlog_targets, &zlog_targets, zt) { if (prio > zt->prio_min) continue; if (!zt->logfn)