]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Fixed a race condition in rcu-domain blocking
authorMaria Matejka <mq@ucw.cz>
Wed, 19 Jun 2024 10:02:34 +0000 (12:02 +0200)
committerMaria Matejka <mq@ucw.cz>
Wed, 19 Jun 2024 10:36:55 +0000 (12:36 +0200)
sysdep/unix/domain.c

index 2817455fdf1b5cec0592050ed156b7207710af4b..4e6d8a61c31733b0382c69af667767beafe763b9 100644 (file)
@@ -137,6 +137,9 @@ void do_lock(struct domain_generic *dg, struct domain_generic **lsp)
 
 void do_unlock(struct domain_generic *dg, struct domain_generic **lsp)
 {
+  if (dg->forbidden_when_reading_rcu)
+    ASSERT_DIE(rcu_blocked--);
+
   if ((char *) lsp - (char *) &locking_stack != dg->order)
     bug("Trying to unlock on bad position: order=%u, lsp=%p, base=%p", dg->order, lsp, &locking_stack);
 
@@ -150,6 +153,5 @@ void do_unlock(struct domain_generic *dg, struct domain_generic **lsp)
   dg->prev = NULL;
   pthread_mutex_unlock(&dg->mutex);
 
-  if (dg->forbidden_when_reading_rcu)
-    ASSERT_DIE(rcu_blocked--);
+  /* From here on, the dg pointer is invalid! */
 }