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 <equinox@opensourcerouting.org>
This commit is contained in:
David Lamparter 2022-03-05 19:39:53 +01:00
parent 404e53da28
commit d03440cab7

View File

@ -401,7 +401,7 @@ void zlog_tls_buffer_flush(void)
return; return;
rcu_read_lock(); rcu_read_lock();
frr_each (zlog_targets, &zlog_targets, zt) { frr_each_safe (zlog_targets, &zlog_targets, zt) {
if (!zt->logfn) if (!zt->logfn)
continue; continue;
@ -431,7 +431,7 @@ static void vzlog_notls(const struct xref_logmsg *xref, int prio,
msg->stackbufsz = sizeof(stackbuf); msg->stackbufsz = sizeof(stackbuf);
rcu_read_lock(); rcu_read_lock();
frr_each (zlog_targets, &zlog_targets, zt) { frr_each_safe (zlog_targets, &zlog_targets, zt) {
if (prio > zt->prio_min) if (prio > zt->prio_min)
continue; continue;
if (!zt->logfn) if (!zt->logfn)