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
 | 
			
		||||
Version:        7.5.1
 | 
			
		||||
Release:        6%{?dist}
 | 
			
		||||
Release:        7%{?dist}
 | 
			
		||||
Summary:        Routing daemon
 | 
			
		||||
License:        GPLv2+
 | 
			
		||||
URL:            http://www.frrouting.org
 | 
			
		||||
@ -20,6 +20,7 @@ Patch0003:      0003-disable-eigrp-crypto.patch
 | 
			
		||||
Patch0004:      0004-fips-mode.patch
 | 
			
		||||
Patch0005:      0005-icc-options.patch
 | 
			
		||||
Patch0006:      0006-move-to-libexec.patch
 | 
			
		||||
Patch0007:      0007-ospfd-crash.patch
 | 
			
		||||
 | 
			
		||||
BuildRequires:  autoconf
 | 
			
		||||
BuildRequires:  automake
 | 
			
		||||
@ -203,6 +204,9 @@ fi
 | 
			
		||||
%{_sysusersdir}/%{name}.conf
 | 
			
		||||
 | 
			
		||||
%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
 | 
			
		||||
- Rebuild for versioned symbols in json-c
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user