public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Alexandre Derumier <aderumier@odiso.com>
To: pve-devel@lists.proxmox.com
Subject: [pve-devel] [PATCH frr] fix #4040 : patch : ospf6d: fix infinite loop when adding ASBR route
Date: Thu, 13 Apr 2023 13:48:03 +0200	[thread overview]
Message-ID: <20230413114803.2435497-1-aderumier@odiso.com> (raw)

---
 .../frr/ospf6d-fix-infinite-loop.patch        | 76 +++++++++++++++++++
 debian/patches/series                         |  1 +
 2 files changed, 77 insertions(+)
 create mode 100644 debian/patches/frr/ospf6d-fix-infinite-loop.patch

diff --git a/debian/patches/frr/ospf6d-fix-infinite-loop.patch b/debian/patches/frr/ospf6d-fix-infinite-loop.patch
new file mode 100644
index 0000000..3af86cd
--- /dev/null
+++ b/debian/patches/frr/ospf6d-fix-infinite-loop.patch
@@ -0,0 +1,76 @@
+From 4dfe15200ab1a84a8d77fcbc33085c373d556eae Mon Sep 17 00:00:00 2001
+From: Renato Westphal <renato@opensourcerouting.org>
+Date: Wed, 23 Nov 2022 22:14:51 -0300
+Subject: [PATCH] ospf6d: fix infinite loop when adding ASBR route
+
+Commit 8f359e1593c414322 removed a check that prevented the same route
+from being added twice. In certain topologies, that change resulted in
+the following infinite loop when adding an ASBR route:
+
+ospf6_route_add
+ ospf6_top_brouter_hook_add
+  ospf6_abr_examin_brouter
+   ospf6_abr_examin_summary
+    ospf6_route_add
+     (repeat until stack overflow)
+
+Revert the offending commit and update `ospf6_route_is_identical()` to
+not do comparison using `memcmp()`.
+
+Signed-off-by: Renato Westphal <renato@opensourcerouting.org>
+---
+ ospf6d/ospf6_route.c | 21 +++++++++++++++++++++
+ ospf6d/ospf6_route.h |  8 ++++++++
+ 2 files changed, 29 insertions(+)
+
+diff --git a/ospf6d/ospf6_route.c b/ospf6d/ospf6_route.c
+index db94b85b1b5..1cc1fcb47b3 100644
+--- a/ospf6d/ospf6_route.c
++++ b/ospf6d/ospf6_route.c
+@@ -702,6 +702,27 @@ struct ospf6_route *ospf6_route_add(struct ospf6_route *route,
+ 	}
+ 
+ 	if (old) {
++		/* if route does not actually change, return unchanged */
++		if (ospf6_route_is_identical(old, route)) {
++			if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
++				zlog_debug(
++					"%s %p: route add %p: needless update of %p old cost %u",
++					ospf6_route_table_name(table),
++					(void *)table, (void *)route,
++					(void *)old, old->path.cost);
++			else if (IS_OSPF6_DEBUG_ROUTE(TABLE))
++				zlog_debug("%s: route add: needless update",
++					   ospf6_route_table_name(table));
++
++			ospf6_route_delete(route);
++			SET_FLAG(old->flag, OSPF6_ROUTE_ADD);
++			ospf6_route_table_assert(table);
++
++			/* to free the lookup lock */
++			route_unlock_node(node);
++			return old;
++		}
++
+ 		if (IS_OSPF6_DEBUG_ROUTE(MEMORY))
+ 			zlog_debug(
+ 				"%s %p: route add %p cost %u paths %u nh %u: update of %p cost %u paths %u nh %u",
+diff --git a/ospf6d/ospf6_route.h b/ospf6d/ospf6_route.h
+index bb5827a1766..c8411c015f8 100644
+--- a/ospf6d/ospf6_route.h
++++ b/ospf6d/ospf6_route.h
+@@ -297,6 +297,14 @@ extern const char *const ospf6_path_type_substr[OSPF6_PATH_TYPE_MAX];
+ 	 && (ra)->path.origin.type == (rb)->path.origin.type                   \
+ 	 && (ra)->path.origin.id == (rb)->path.origin.id                       \
+ 	 && (ra)->path.origin.adv_router == (rb)->path.origin.adv_router)
++#define ospf6_route_is_identical(ra, rb)                                       \
++	((ra)->type == (rb)->type &&                                           \
++	 prefix_same(&(ra)->prefix, &(rb)->prefix) &&                          \
++	 (ra)->path.type == (rb)->path.type &&                                 \
++	 (ra)->path.cost == (rb)->path.cost &&                                 \
++	 (ra)->path.u.cost_e2 == (rb)->path.u.cost_e2 &&                       \
++	 listcount(ra->paths) == listcount(rb->paths) &&                       \
++	 ospf6_route_cmp_nexthops(ra, rb) == 0)
+ 
+ #define ospf6_route_is_best(r) (CHECK_FLAG ((r)->flag, OSPF6_ROUTE_BEST))
+ 
diff --git a/debian/patches/series b/debian/patches/series
index c3b3fc0..b24c177 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -3,3 +3,4 @@ pve/0002-bgpd-add-an-option-for-RT-auto-derivation-to-force-A.patch
 frr/0001-zebra-buffering.patch
 frr/0002-zebra-buffering.patch
 frr/0003-zebra-buffering.patch
+frr/ospf6d-fix-infinite-loop.patch
\ No newline at end of file
-- 
2.30.2




             reply	other threads:[~2023-04-13 11:48 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-04-13 11:48 Alexandre Derumier [this message]
2023-06-06  8:40 ` [pve-devel] applied: " Thomas Lamprecht

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20230413114803.2435497-1-aderumier@odiso.com \
    --to=aderumier@odiso.com \
    --cc=pve-devel@lists.proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal