From: Paul Moore <paul@paul-moore.com>
To: Nikolay Aleksandrov <nikolay@redhat.com>
Cc: netdev@vger.kernel.org,
LSM list <linux-security-module@vger.kernel.org>,
selinux@tycho.nsa.gov, Fan Du <fan.du@windriver.com>,
Dave Jones <davej@redhat.com>,
"David S. Miller" <davem@davemloft.net>
Subject: Re: [PATCH 2/2] selinux: add gfp argument to security_xfrm_policy_alloc and fix callers
Date: Thu, 06 Mar 2014 22:22:02 -0500 [thread overview]
Message-ID: <3932171.ispFyGS1cS@sifl> (raw)
In-Reply-To: <1393935984-8733-3-git-send-email-nikolay@redhat.com>
On Tuesday, March 04, 2014 01:26:24 PM Nikolay Aleksandrov wrote:
> security_xfrm_policy_alloc can be called in atomic context so the
> allocation should be done with GFP_ATOMIC. Add an argument to let the
> callers choose the appropriate way. In order to do so a gfp argument
> needs to be added to the method xfrm_policy_alloc_security in struct
> security_operations and to the internal function
> selinux_xfrm_alloc_user. After that switch to GFP_ATOMIC in the atomic
> callers and leave GFP_KERNEL as before for the rest.
> The path that needed the gfp argument addition is:
> security_xfrm_policy_alloc -> security_ops.xfrm_policy_alloc_security ->
> all users of xfrm_policy_alloc_security (e.g. selinux_xfrm_policy_alloc) ->
> selinux_xfrm_alloc_user (here the allocation used to be GFP_KERNEL only)
>
> CC: Paul Moore <paul@paul-moore.com>
> CC: Dave Jones <davej@redhat.com>
> CC: Steffen Klassert <steffen.klassert@secunet.com>
> CC: Fan Du <fan.du@windriver.com>
> CC: David S. Miller <davem@davemloft.net>
> CC: LSM list <linux-security-module@vger.kernel.org>
>
> Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
[NOTE: added the SELinux list to the CC list above]
In general, the patch is pretty simple with the obvious necessary changes,
just one gotcha, see below.
> diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c
> index 0462cb3ff0a7..7ae773f4fe38 100644
> --- a/security/selinux/xfrm.c
> +++ b/security/selinux/xfrm.c
> @@ -78,7 +78,8 @@ static inline int selinux_authorizable_xfrm(struct
> xfrm_state *x) * xfrm_user_sec_ctx context.
> */
> static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx **ctxp,
> - struct xfrm_user_sec_ctx *uctx)
> + struct xfrm_user_sec_ctx *uctx,
> + gfp_t gfp)
> {
> int rc;
> const struct task_security_struct *tsec = current_security();
> @@ -94,7 +95,7 @@ static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx
> **ctxp, if (str_len >= PAGE_SIZE)
> return -ENOMEM;
>
> - ctx = kmalloc(sizeof(*ctx) + str_len + 1, GFP_KERNEL);
> + ctx = kmalloc(sizeof(*ctx) + str_len + 1, gfp);
> if (!ctx)
> return -ENOMEM;
Also located in selinux_xfrm_alloc_user() is a call to
security_context_to_sid() which calls security_context_to_sid_core() which in
some cases does allocate memory. The good news is that to_sid_core() does
accept a gfp_t flag, the bad news is that to_sid() always passes GFP_KERNEL.
It looks like we need to extend this patch a bit, or add another. Sorry about
that. If you're getting tired of playing with the LSM/SELinux code let me
know :)
> @@ -282,9 +283,10 @@ int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid)
> * LSM hook implementation that allocs and transfers uctx spec to
> xfrm_policy. */
> int selinux_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp,
> - struct xfrm_user_sec_ctx *uctx)
> + struct xfrm_user_sec_ctx *uctx,
> + gfp_t gfp)
> {
> - return selinux_xfrm_alloc_user(ctxp, uctx);
> + return selinux_xfrm_alloc_user(ctxp, uctx, gfp);
> }
>
> /*
> @@ -332,7 +334,7 @@ int selinux_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)
> int selinux_xfrm_state_alloc(struct xfrm_state *x,
> struct xfrm_user_sec_ctx *uctx)
> {
> - return selinux_xfrm_alloc_user(&x->security, uctx);
> + return selinux_xfrm_alloc_user(&x->security, uctx, GFP_KERNEL);
> }
>
> /*
--
paul moore
www.paul-moore.com
WARNING: multiple messages have this Message-ID (diff)
From: Paul Moore <paul@paul-moore.com>
To: Nikolay Aleksandrov <nikolay@redhat.com>
Cc: netdev@vger.kernel.org, Dave Jones <davej@redhat.com>,
Steffen Klassert <steffen.klassert@secunet.com>,
Fan Du <fan.du@windriver.com>,
"David S. Miller" <davem@davemloft.net>,
LSM list <linux-security-module@vger.kernel.org>,
selinux@tycho.nsa.gov
Subject: Re: [PATCH 2/2] selinux: add gfp argument to security_xfrm_policy_alloc and fix callers
Date: Thu, 06 Mar 2014 22:22:02 -0500 [thread overview]
Message-ID: <3932171.ispFyGS1cS@sifl> (raw)
In-Reply-To: <1393935984-8733-3-git-send-email-nikolay@redhat.com>
On Tuesday, March 04, 2014 01:26:24 PM Nikolay Aleksandrov wrote:
> security_xfrm_policy_alloc can be called in atomic context so the
> allocation should be done with GFP_ATOMIC. Add an argument to let the
> callers choose the appropriate way. In order to do so a gfp argument
> needs to be added to the method xfrm_policy_alloc_security in struct
> security_operations and to the internal function
> selinux_xfrm_alloc_user. After that switch to GFP_ATOMIC in the atomic
> callers and leave GFP_KERNEL as before for the rest.
> The path that needed the gfp argument addition is:
> security_xfrm_policy_alloc -> security_ops.xfrm_policy_alloc_security ->
> all users of xfrm_policy_alloc_security (e.g. selinux_xfrm_policy_alloc) ->
> selinux_xfrm_alloc_user (here the allocation used to be GFP_KERNEL only)
>
> CC: Paul Moore <paul@paul-moore.com>
> CC: Dave Jones <davej@redhat.com>
> CC: Steffen Klassert <steffen.klassert@secunet.com>
> CC: Fan Du <fan.du@windriver.com>
> CC: David S. Miller <davem@davemloft.net>
> CC: LSM list <linux-security-module@vger.kernel.org>
>
> Signed-off-by: Nikolay Aleksandrov <nikolay@redhat.com>
[NOTE: added the SELinux list to the CC list above]
In general, the patch is pretty simple with the obvious necessary changes,
just one gotcha, see below.
> diff --git a/security/selinux/xfrm.c b/security/selinux/xfrm.c
> index 0462cb3ff0a7..7ae773f4fe38 100644
> --- a/security/selinux/xfrm.c
> +++ b/security/selinux/xfrm.c
> @@ -78,7 +78,8 @@ static inline int selinux_authorizable_xfrm(struct
> xfrm_state *x) * xfrm_user_sec_ctx context.
> */
> static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx **ctxp,
> - struct xfrm_user_sec_ctx *uctx)
> + struct xfrm_user_sec_ctx *uctx,
> + gfp_t gfp)
> {
> int rc;
> const struct task_security_struct *tsec = current_security();
> @@ -94,7 +95,7 @@ static int selinux_xfrm_alloc_user(struct xfrm_sec_ctx
> **ctxp, if (str_len >= PAGE_SIZE)
> return -ENOMEM;
>
> - ctx = kmalloc(sizeof(*ctx) + str_len + 1, GFP_KERNEL);
> + ctx = kmalloc(sizeof(*ctx) + str_len + 1, gfp);
> if (!ctx)
> return -ENOMEM;
Also located in selinux_xfrm_alloc_user() is a call to
security_context_to_sid() which calls security_context_to_sid_core() which in
some cases does allocate memory. The good news is that to_sid_core() does
accept a gfp_t flag, the bad news is that to_sid() always passes GFP_KERNEL.
It looks like we need to extend this patch a bit, or add another. Sorry about
that. If you're getting tired of playing with the LSM/SELinux code let me
know :)
> @@ -282,9 +283,10 @@ int selinux_xfrm_skb_sid(struct sk_buff *skb, u32 *sid)
> * LSM hook implementation that allocs and transfers uctx spec to
> xfrm_policy. */
> int selinux_xfrm_policy_alloc(struct xfrm_sec_ctx **ctxp,
> - struct xfrm_user_sec_ctx *uctx)
> + struct xfrm_user_sec_ctx *uctx,
> + gfp_t gfp)
> {
> - return selinux_xfrm_alloc_user(ctxp, uctx);
> + return selinux_xfrm_alloc_user(ctxp, uctx, gfp);
> }
>
> /*
> @@ -332,7 +334,7 @@ int selinux_xfrm_policy_delete(struct xfrm_sec_ctx *ctx)
> int selinux_xfrm_state_alloc(struct xfrm_state *x,
> struct xfrm_user_sec_ctx *uctx)
> {
> - return selinux_xfrm_alloc_user(&x->security, uctx);
> + return selinux_xfrm_alloc_user(&x->security, uctx, GFP_KERNEL);
> }
>
> /*
--
paul moore
www.paul-moore.com
next prev parent reply other threads:[~2014-03-07 3:22 UTC|newest]
Thread overview: 32+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-02-27 15:19 kmalloc with locks held in xfrm Dave Jones
2014-02-27 16:17 ` Possible fix Nikolay Aleksandrov
2014-02-27 16:24 ` Nikolay Aleksandrov
2014-02-27 17:05 ` Nikolay Aleksandrov
2014-02-28 7:23 ` Steffen Klassert
2014-02-28 10:10 ` Nikolay Aleksandrov
2014-02-28 22:10 ` Paul Moore
2014-03-02 16:26 ` Nikolay Aleksandrov
2014-03-05 12:20 ` Steffen Klassert
2014-03-07 3:04 ` Paul Moore
2014-03-07 11:23 ` Steffen Klassert
2014-03-07 15:50 ` Paul Moore
2014-03-04 12:26 ` [PATCH 0/2] af_key: fixes for sleeping while atomic Nikolay Aleksandrov
2014-03-04 12:26 ` [PATCH 1/2] net: af_key: fix sleeping under rcu Nikolay Aleksandrov
2014-03-04 12:46 ` David Laight
2014-03-04 21:40 ` David Miller
2014-03-04 12:26 ` [PATCH 2/2] selinux: add gfp argument to security_xfrm_policy_alloc and fix callers Nikolay Aleksandrov
2014-03-07 3:22 ` Paul Moore [this message]
2014-03-07 3:22 ` Paul Moore
2014-03-07 10:52 ` Nikolay Aleksandrov
2014-03-07 10:52 ` Nikolay Aleksandrov
2014-03-05 12:07 ` [PATCH 0/2] af_key: fixes for sleeping while atomic Steffen Klassert
2014-03-05 22:21 ` Paul Moore
2014-03-07 11:44 ` [PATCHv2 " Nikolay Aleksandrov
2014-03-07 11:44 ` [PATCHv2 1/2] net: af_key: fix sleeping under rcu Nikolay Aleksandrov
2014-03-07 11:44 ` [PATCHv2 2/2] selinux: add gfp argument to security_xfrm_policy_alloc and fix callers Nikolay Aleksandrov
2014-03-07 11:44 ` Nikolay Aleksandrov
2014-03-07 22:27 ` Paul Moore
2014-03-07 22:27 ` Paul Moore
2014-03-10 12:52 ` Steffen Klassert
2014-03-10 12:52 ` Steffen Klassert
-- strict thread matches above, loose matches on Subject: below --
2014-03-18 7:43 pull request (net): ipsec 2014-03-18 Steffen Klassert
2014-03-18 7:43 ` [PATCH 2/2] selinux: add gfp argument to security_xfrm_policy_alloc and fix callers Steffen Klassert
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3932171.ispFyGS1cS@sifl \
--to=paul@paul-moore.com \
--cc=davej@redhat.com \
--cc=davem@davemloft.net \
--cc=fan.du@windriver.com \
--cc=linux-security-module@vger.kernel.org \
--cc=netdev@vger.kernel.org \
--cc=nikolay@redhat.com \
--cc=selinux@tycho.nsa.gov \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.