Resolves: #1983278 - ospfd crashes in route_node_delete with assertion fail
This commit is contained in:
parent
60a5f4164e
commit
31b2cc24c1
108
0007-ospfd-crash.patch
Normal file
108
0007-ospfd-crash.patch
Normal file
@ -0,0 +1,108 @@
|
|||||||
|
From 4f08c715db6893ff439d0a39bf4506cd26256d13 Mon Sep 17 00:00:00 2001
|
||||||
|
From: Igor Ryzhov <iryzhov@nfware.com>
|
||||||
|
Date: Fri, 18 Jun 2021 13:06:13 +0300
|
||||||
|
Subject: [PATCH] lib: remove pure attribute from functions that modify memory
|
||||||
|
|
||||||
|
Almost all functions currently marked with pure attribute acquire a
|
||||||
|
route_node lock. By marking them pure we allow compiler to optimize the
|
||||||
|
code and not call them when it already knows the return value. This is
|
||||||
|
completely incorrect.
|
||||||
|
|
||||||
|
Only two of eleven functions can be marked as pure. And they still won't
|
||||||
|
be optimized because they are never called from the same function twice.
|
||||||
|
Let's remove the ext_pure macro completely to reduce the chance of
|
||||||
|
repeating this mistake in the future.
|
||||||
|
|
||||||
|
Fixes #8866, #8809, #8595, #6992.
|
||||||
|
|
||||||
|
Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
|
||||||
|
---
|
||||||
|
lib/compiler.h | 9 ---------
|
||||||
|
lib/table.h | 44 ++++++++++++++++++++------------------------
|
||||||
|
2 files changed, 20 insertions(+), 33 deletions(-)
|
||||||
|
|
||||||
|
diff --git a/lib/compiler.h b/lib/compiler.h
|
||||||
|
index bbfe01b569c..e805eb8be48 100644
|
||||||
|
--- a/lib/compiler.h
|
||||||
|
+++ b/lib/compiler.h
|
||||||
|
@@ -123,15 +123,6 @@ extern "C" {
|
||||||
|
#define assume(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
-/* pure = function does not modify memory & return value is the same if
|
||||||
|
- * memory hasn't changed (=> allows compiler to optimize)
|
||||||
|
- *
|
||||||
|
- * Mostly autodetected by the compiler if function body is available (i.e.
|
||||||
|
- * static inline functions in headers). Since that implies it should only be
|
||||||
|
- * used in headers for non-inline functions, the "extern" is included here.
|
||||||
|
- */
|
||||||
|
-#define ext_pure extern __attribute__((pure))
|
||||||
|
-
|
||||||
|
/* for helper functions defined inside macros */
|
||||||
|
#define macro_inline static inline __attribute__((unused))
|
||||||
|
#define macro_pure static inline __attribute__((unused, pure))
|
||||||
|
diff --git a/lib/table.h b/lib/table.h
|
||||||
|
index 7e383dce808..5dec69ee7ea 100644
|
||||||
|
--- a/lib/table.h
|
||||||
|
+++ b/lib/table.h
|
||||||
|
@@ -197,29 +197,25 @@ static inline void route_table_set_info(struct route_table *table, void *d)
|
||||||
|
table->info = d;
|
||||||
|
}
|
||||||
|
|
||||||
|
-/* ext_pure => extern __attribute__((pure))
|
||||||
|
- * does not modify memory (but depends on mem), allows compiler to optimize
|
||||||
|
- */
|
||||||
|
-
|
||||||
|
extern void route_table_finish(struct route_table *table);
|
||||||
|
-ext_pure struct route_node *route_top(struct route_table *table);
|
||||||
|
-ext_pure struct route_node *route_next(struct route_node *node);
|
||||||
|
-ext_pure struct route_node *route_next_until(struct route_node *node,
|
||||||
|
- const struct route_node *limit);
|
||||||
|
+extern struct route_node *route_top(struct route_table *table);
|
||||||
|
+extern struct route_node *route_next(struct route_node *node);
|
||||||
|
+extern struct route_node *route_next_until(struct route_node *node,
|
||||||
|
+ const struct route_node *limit);
|
||||||
|
extern struct route_node *route_node_get(struct route_table *table,
|
||||||
|
union prefixconstptr pu);
|
||||||
|
-ext_pure struct route_node *route_node_lookup(struct route_table *table,
|
||||||
|
- union prefixconstptr pu);
|
||||||
|
-ext_pure struct route_node *route_node_lookup_maynull(struct route_table *table,
|
||||||
|
- union prefixconstptr pu);
|
||||||
|
-ext_pure struct route_node *route_node_match(struct route_table *table,
|
||||||
|
- union prefixconstptr pu);
|
||||||
|
-ext_pure struct route_node *route_node_match_ipv4(struct route_table *table,
|
||||||
|
- const struct in_addr *addr);
|
||||||
|
-ext_pure struct route_node *route_node_match_ipv6(struct route_table *table,
|
||||||
|
- const struct in6_addr *addr);
|
||||||
|
-
|
||||||
|
-ext_pure unsigned long route_table_count(struct route_table *table);
|
||||||
|
+extern struct route_node *route_node_lookup(struct route_table *table,
|
||||||
|
+ union prefixconstptr pu);
|
||||||
|
+extern struct route_node *route_node_lookup_maynull(struct route_table *table,
|
||||||
|
+ union prefixconstptr pu);
|
||||||
|
+extern struct route_node *route_node_match(struct route_table *table,
|
||||||
|
+ union prefixconstptr pu);
|
||||||
|
+extern struct route_node *route_node_match_ipv4(struct route_table *table,
|
||||||
|
+ const struct in_addr *addr);
|
||||||
|
+extern struct route_node *route_node_match_ipv6(struct route_table *table,
|
||||||
|
+ const struct in6_addr *addr);
|
||||||
|
+
|
||||||
|
+extern unsigned long route_table_count(struct route_table *table);
|
||||||
|
|
||||||
|
extern struct route_node *route_node_create(route_table_delegate_t *delegate,
|
||||||
|
struct route_table *table);
|
||||||
|
@@ -228,10 +224,10 @@ extern void route_node_destroy(route_table_delegate_t *delegate,
|
||||||
|
struct route_table *table,
|
||||||
|
struct route_node *node);
|
||||||
|
|
||||||
|
-ext_pure struct route_node *route_table_get_next(struct route_table *table,
|
||||||
|
- union prefixconstptr pu);
|
||||||
|
-ext_pure int route_table_prefix_iter_cmp(const struct prefix *p1,
|
||||||
|
- const struct prefix *p2);
|
||||||
|
+extern struct route_node *route_table_get_next(struct route_table *table,
|
||||||
|
+ union prefixconstptr pu);
|
||||||
|
+extern int route_table_prefix_iter_cmp(const struct prefix *p1,
|
||||||
|
+ const struct prefix *p2);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Iterator functions.
|
6
frr.spec
6
frr.spec
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
Name: frr
|
Name: frr
|
||||||
Version: 7.5.1
|
Version: 7.5.1
|
||||||
Release: 6%{?dist}
|
Release: 7%{?dist}
|
||||||
Summary: Routing daemon
|
Summary: Routing daemon
|
||||||
License: GPLv2+
|
License: GPLv2+
|
||||||
URL: http://www.frrouting.org
|
URL: http://www.frrouting.org
|
||||||
@ -20,6 +20,7 @@ Patch0003: 0003-disable-eigrp-crypto.patch
|
|||||||
Patch0004: 0004-fips-mode.patch
|
Patch0004: 0004-fips-mode.patch
|
||||||
Patch0005: 0005-icc-options.patch
|
Patch0005: 0005-icc-options.patch
|
||||||
Patch0006: 0006-move-to-libexec.patch
|
Patch0006: 0006-move-to-libexec.patch
|
||||||
|
Patch0007: 0007-ospfd-crash.patch
|
||||||
|
|
||||||
BuildRequires: autoconf
|
BuildRequires: autoconf
|
||||||
BuildRequires: automake
|
BuildRequires: automake
|
||||||
@ -203,6 +204,9 @@ fi
|
|||||||
%{_sysusersdir}/%{name}.conf
|
%{_sysusersdir}/%{name}.conf
|
||||||
|
|
||||||
%changelog
|
%changelog
|
||||||
|
* Tue Jul 20 2021 Michal Ruprich <mruprich@redhat.com> - 7.5.1-7
|
||||||
|
- Resolves: #1983278 - ospfd crashes in route_node_delete with assertion fail
|
||||||
|
|
||||||
* Sat Jul 10 2021 Björn Esser <besser82@fedoraproject.org> - 7.5.1-6
|
* Sat Jul 10 2021 Björn Esser <besser82@fedoraproject.org> - 7.5.1-6
|
||||||
- Rebuild for versioned symbols in json-c
|
- Rebuild for versioned symbols in json-c
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user