all lists on 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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal