forked from mirrors/linux
		
	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_register_afinfo(const struct xfrm_input_afinfo *afinfo);
 | 
				
			||||||
int xfrm_input_unregister_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);
 | 
					void xfrm_state_delete_tunnel(struct xfrm_state *x);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct xfrm_type {
 | 
					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);
 | 
						struct xfrm6_tunnel_net *xfrm6_tn = xfrm6_tunnel_pernet(net);
 | 
				
			||||||
	unsigned int i;
 | 
						unsigned int i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						xfrm_state_flush(net, IPSEC_PROTO_ANY, false);
 | 
				
			||||||
 | 
						xfrm_flush_gc();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	for (i = 0; i < XFRM6_TUNNEL_SPI_BYADDR_HSIZE; i++)
 | 
						for (i = 0; i < XFRM6_TUNNEL_SPI_BYADDR_HSIZE; i++)
 | 
				
			||||||
		WARN_ON_ONCE(!hlist_empty(&xfrm6_tn->spi_byaddr[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;
 | 
						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 */
 | 
					/* Temporarily located here until net/xfrm/xfrm_tunnel.c is created */
 | 
				
			||||||
void xfrm_state_delete_tunnel(struct xfrm_state *x)
 | 
					void xfrm_state_delete_tunnel(struct xfrm_state *x)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue