From d03440cab78605dcc21427127afdf78860d9916b Mon Sep 17 00:00:00 2001 From: David Lamparter Date: Sat, 5 Mar 2022 19:39:53 +0100 Subject: [PATCH] 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 --- lib/zlog.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) 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) -- 2.39.5