]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
Static: Unlock IGP tables on cleanup to avoid problems with hostentry unlocking
authorMaria Matejka <mq@ucw.cz>
Tue, 5 Mar 2024 11:17:56 +0000 (12:17 +0100)
committerMaria Matejka <mq@ucw.cz>
Sat, 6 Apr 2024 16:28:43 +0000 (18:28 +0200)
nest/rt-table.c
proto/static/static.c

index 424e7fc78fc6900cdf246d647744285f3f64ad42..e37c8005b311b6fd0fbccb76623f92afcf291329 100644 (file)
@@ -4476,10 +4476,7 @@ hostentry_tmp_unlock(resource *r)
 {
   struct hostentry_tmp_lock *l = SKIP_BACK(struct hostentry_tmp_lock, r, r);
   RT_LOCKED(l->tab, tab)
-  {
     l->he->uc--;
-    rt_unlock_table(tab);
-  }
 }
 
 static void
@@ -4524,7 +4521,6 @@ rt_get_hostentry(struct rtable_private *tab, ip_addr a, ip_addr ll, rtable *dep)
   l->he = he;
   l->tab = RT_PUB(tab);
   l->he->uc++;
-  rt_lock_table(tab);
 
   return he;
 }
index bba868a6e41f4afcc40df16a61e788f1c069f057..aa3f7bac530c70a2da528c8cc11b7b21fff62196 100644 (file)
@@ -564,13 +564,19 @@ static_shutdown(struct proto *P)
   WALK_LIST(r, cf->routes)
     static_reset_rte(p, r);
 
+  return PS_DOWN;
+}
+
+static void
+static_cleanup(struct proto *P)
+{
+  struct static_proto *p = (void *) P;
+
   if (p->igp_table_ip4)
     rt_unlock_table(p->igp_table_ip4);
 
   if (p->igp_table_ip6)
     rt_unlock_table(p->igp_table_ip6);
-
-  return PS_DOWN;
 }
 
 static void
@@ -835,6 +841,7 @@ struct protocol proto_static = {
   .dump =              static_dump,
   .start =             static_start,
   .shutdown =          static_shutdown,
+  .cleanup =           static_cleanup,
   .reconfigure =       static_reconfigure,
   .copy_config =       static_copy_config,
 };