summaryrefslogtreecommitdiff
path: root/net/bird3/files/patch-15-BGP-fixed-deterministic-med-crashes
blob: 15f3fac00287fa190073a5b28b1148c9ab7f0948 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
From c5b07695ce810e4345ed1811eadfce935c83b324 Mon Sep 17 00:00:00 2001
From: Maria Matejka <mq@ucw.cz>
Date: Tue, 7 Jan 2025 11:08:04 +0100
Subject: [PATCH] BGP: fixed deterministic med crashes

There were several places of forgotten NULL checks.

Thanks to Alarig Le Lay <alarig@swordarmor.fr> for reporting:
https://trubka.network.cz/pipermail/bird-users/2024-December/017990.html
---
 nest/rt-table.c   | 14 ++++++++++++--
 proto/bgp/attrs.c |  8 ++++----
 2 files changed, 16 insertions(+), 6 deletions(-)

diff --git a/nest/rt-table.c b/nest/rt-table.c
index 05191d743..fc6d0d4e0 100644
--- nest/rt-table.c
+++ nest/rt-table.c
@@ -2024,12 +2024,22 @@ rte_recalculate(struct rtable_private *table, struct rt_import_hook *c, struct n
 	do_recalculate:
 	  /* Add the new route to the list right behind the old one */
 	  if (new_stored)
+	  {
+	    /* There is the same piece of code several lines farther. Needs refactoring.
+	     * The old_stored check is needed because of the possible jump from deterministic med */
+	    if (old_stored)
 	    {
 	      atomic_store_explicit(&new_stored->next, atomic_load_explicit(&old_stored->next, memory_order_relaxed), memory_order_release);
 	      atomic_store_explicit(&old_stored->next, new_stored, memory_order_release);
-
-	      table->rt_count++;
 	    }
+	    else
+	    {
+	      atomic_store_explicit(&new_stored->next, NULL, memory_order_release);
+	      atomic_store_explicit(last_ptr, new_stored, memory_order_release);
+	    }
+
+	    table->rt_count++;
+	  }
 
 	  /* Find a new optimal route (if there is any) */
 	  struct rte_storage * _Atomic *bp = &local_sentinel.next;
diff --git a/proto/bgp/attrs.c b/proto/bgp/attrs.c
index 5dc06be51..db6542343 100644
--- proto/bgp/attrs.c
+++ proto/bgp/attrs.c
@@ -2689,10 +2689,10 @@ bgp_rte_recalculate(struct rtable_private *table, net *net,
     struct rte_storage *new_stored, struct rte_storage *old_stored, struct rte_storage *old_best_stored)
 {
   struct rte_storage *key_stored = new_stored ? new_stored : old_stored;
-  const struct rte *new = &new_stored->rte,
-		   *old = &old_stored->rte,
-		   *old_best = &old_best_stored->rte,
-		   *key = &key_stored->rte;
+  const struct rte *new = RTE_OR_NULL(new_stored),
+		   *old = RTE_OR_NULL(old_stored),
+		   *old_best = RTE_OR_NULL(old_best_stored),
+		   *key = RTE_OR_NULL(key_stored);
 
   u32 lpref = rt_get_preference(key);
   u32 lasn = bgp_get_neighbor(key);
-- 
GitLab