mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 02:30:34 +02:00 
			
		
		
		
	xfrm: Fix warning in xfrm6_tunnel_net_exit.
We need to make sure that all states are really deleted
before we check that the state lists are empty. Otherwise
we trigger a warning.
Fixes: baeb0dbbb5 ("xfrm6_tunnel: exit_net cleanup check added")
Reported-and-tested-by:syzbot+777bf170a89e7b326405@syzkaller.appspotmail.com
Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
			
			
This commit is contained in:
		
							parent
							
								
									4b66af2d63
								
							
						
					
					
						commit
						b48c05ab5d
					
				
					 3 changed files with 10 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -375,6 +375,7 @@ struct xfrm_input_afinfo {
 | 
			
		|||
int xfrm_input_register_afinfo(const struct xfrm_input_afinfo *afinfo);
 | 
			
		||||
int xfrm_input_unregister_afinfo(const struct xfrm_input_afinfo *afinfo);
 | 
			
		||||
 | 
			
		||||
void xfrm_flush_gc(void);
 | 
			
		||||
void xfrm_state_delete_tunnel(struct xfrm_state *x);
 | 
			
		||||
 | 
			
		||||
struct xfrm_type {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -341,6 +341,9 @@ static void __net_exit xfrm6_tunnel_net_exit(struct net *net)
 | 
			
		|||
	struct xfrm6_tunnel_net *xfrm6_tn = xfrm6_tunnel_pernet(net);
 | 
			
		||||
	unsigned int i;
 | 
			
		||||
 | 
			
		||||
	xfrm_state_flush(net, IPSEC_PROTO_ANY, false);
 | 
			
		||||
	xfrm_flush_gc();
 | 
			
		||||
 | 
			
		||||
	for (i = 0; i < XFRM6_TUNNEL_SPI_BYADDR_HSIZE; i++)
 | 
			
		||||
		WARN_ON_ONCE(!hlist_empty(&xfrm6_tn->spi_byaddr[i]));
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2175,6 +2175,12 @@ struct xfrm_state_afinfo *xfrm_state_get_afinfo(unsigned int family)
 | 
			
		|||
	return afinfo;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void xfrm_flush_gc(void)
 | 
			
		||||
{
 | 
			
		||||
	flush_work(&xfrm_state_gc_work);
 | 
			
		||||
}
 | 
			
		||||
EXPORT_SYMBOL(xfrm_flush_gc);
 | 
			
		||||
 | 
			
		||||
/* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */
 | 
			
		||||
void xfrm_state_delete_tunnel(struct xfrm_state *x)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue