mirror of
				https://github.com/torvalds/linux.git
				synced 2025-11-04 10:40:15 +02:00 
			
		
		
		
	xfrm: Fix xfrm_state_clone leak
xfrm_state_clone calls kfree instead of xfrm_state_put to free a failed state. Depending on the state of the failed state, it can cause leaks to things like module references. All states should be freed by xfrm_state_put past the point of xfrm_init_state. Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
		
							parent
							
								
									10e7454ed7
								
							
						
					
					
						commit
						553f9118ab
					
				
					 1 changed files with 3 additions and 9 deletions
				
			
		| 
						 | 
				
			
			@ -1102,7 +1102,7 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp)
 | 
			
		|||
	int err = -ENOMEM;
 | 
			
		||||
	struct xfrm_state *x = xfrm_state_alloc(net);
 | 
			
		||||
	if (!x)
 | 
			
		||||
		goto error;
 | 
			
		||||
		goto out;
 | 
			
		||||
 | 
			
		||||
	memcpy(&x->id, &orig->id, sizeof(x->id));
 | 
			
		||||
	memcpy(&x->sel, &orig->sel, sizeof(x->sel));
 | 
			
		||||
| 
						 | 
				
			
			@ -1160,16 +1160,10 @@ static struct xfrm_state *xfrm_state_clone(struct xfrm_state *orig, int *errp)
 | 
			
		|||
	return x;
 | 
			
		||||
 | 
			
		||||
 error:
 | 
			
		||||
	xfrm_state_put(x);
 | 
			
		||||
out:
 | 
			
		||||
	if (errp)
 | 
			
		||||
		*errp = err;
 | 
			
		||||
	if (x) {
 | 
			
		||||
		kfree(x->aalg);
 | 
			
		||||
		kfree(x->ealg);
 | 
			
		||||
		kfree(x->calg);
 | 
			
		||||
		kfree(x->encap);
 | 
			
		||||
		kfree(x->coaddr);
 | 
			
		||||
	}
 | 
			
		||||
	kfree(x);
 | 
			
		||||
	return NULL;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in a new issue