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