Re: [PATCH 1/2] net: af_key: fix sleeping under rcu
From: David Miller <davem@davemloft.net>
Date: 2014-03-04 21:40:17
From: David Laight <redacted> Date: Tue, 4 Mar 2014 12:46:48 +0000
From: Nikolay Aleksandrovquoted
There's a kmalloc with GFP_KERNEL in a helper (pfkey_sadb2xfrm_user_sec_ctx) used in pfkey_compile_policy which is called under rcu_read_lock. Adjust pfkey_sadb2xfrm_user_sec_ctx to have a gfp argument and adjust the users....quoted
@@ -3239,7 +3240,7 @@ static struct xfrm_policy *pfkey_compile_policy(struct sock *sk, int opt, } if ((*dir = verify_sec_ctx_len(p))) goto out; - uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx); + uctx = pfkey_sadb2xfrm_user_sec_ctx(sec_ctx, GFP_ATOMIC); *dir = security_xfrm_policy_alloc(&xp->security, uctx); kfree(uctx);This looks like the only one that isn't passed GFP_KERNEL. It looks as though it is missing the check for the allocation failing (there might be a check inside security_xfrm_policy_alloc()). In any case it looks as though this ought to be codeable without the allocation of 'uctx' - since it is freed a line later.
Unfortunately, it is not possible to avoid allocations. The uctx is of a variable size, because it is a base struct, with a variable length part afterwards.