Commit 0de0b768 authored by Linus Torvalds's avatar Linus Torvalds

Merge tag 'selinux-pr-20221020' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux

Pull selinux fix from Paul Moore:
 "A small SELinux fix for a GFP_KERNEL allocation while a spinlock is
  held.

  The patch, while still fairly small, is a bit larger than one might
  expect from a simple s/GFP_KERNEL/GFP_ATOMIC/ conversion because we
  added support for the function to be called with different gfp flags
  depending on the context, preserving GFP_KERNEL for those cases that
  can safely sleep"

* tag 'selinux-pr-20221020' of git://git.kernel.org/pub/scm/linux/kernel/git/pcmoore/selinux:
  selinux: enable use of both GFP_KERNEL and GFP_ATOMIC in convert_context()
parents 440b7895 abe3c631
...@@ -2022,7 +2022,8 @@ static inline int convert_context_handle_invalid_context( ...@@ -2022,7 +2022,8 @@ static inline int convert_context_handle_invalid_context(
* in `newc'. Verify that the context is valid * in `newc'. Verify that the context is valid
* under the new policy. * under the new policy.
*/ */
static int convert_context(struct context *oldc, struct context *newc, void *p) static int convert_context(struct context *oldc, struct context *newc, void *p,
gfp_t gfp_flags)
{ {
struct convert_context_args *args; struct convert_context_args *args;
struct ocontext *oc; struct ocontext *oc;
...@@ -2036,7 +2037,7 @@ static int convert_context(struct context *oldc, struct context *newc, void *p) ...@@ -2036,7 +2037,7 @@ static int convert_context(struct context *oldc, struct context *newc, void *p)
args = p; args = p;
if (oldc->str) { if (oldc->str) {
s = kstrdup(oldc->str, GFP_KERNEL); s = kstrdup(oldc->str, gfp_flags);
if (!s) if (!s)
return -ENOMEM; return -ENOMEM;
......
...@@ -325,7 +325,7 @@ int sidtab_context_to_sid(struct sidtab *s, struct context *context, ...@@ -325,7 +325,7 @@ int sidtab_context_to_sid(struct sidtab *s, struct context *context,
} }
rc = convert->func(context, &dst_convert->context, rc = convert->func(context, &dst_convert->context,
convert->args); convert->args, GFP_ATOMIC);
if (rc) { if (rc) {
context_destroy(&dst->context); context_destroy(&dst->context);
goto out_unlock; goto out_unlock;
...@@ -404,7 +404,7 @@ static int sidtab_convert_tree(union sidtab_entry_inner *edst, ...@@ -404,7 +404,7 @@ static int sidtab_convert_tree(union sidtab_entry_inner *edst,
while (i < SIDTAB_LEAF_ENTRIES && *pos < count) { while (i < SIDTAB_LEAF_ENTRIES && *pos < count) {
rc = convert->func(&esrc->ptr_leaf->entries[i].context, rc = convert->func(&esrc->ptr_leaf->entries[i].context,
&edst->ptr_leaf->entries[i].context, &edst->ptr_leaf->entries[i].context,
convert->args); convert->args, GFP_KERNEL);
if (rc) if (rc)
return rc; return rc;
(*pos)++; (*pos)++;
......
...@@ -65,7 +65,7 @@ struct sidtab_isid_entry { ...@@ -65,7 +65,7 @@ struct sidtab_isid_entry {
}; };
struct sidtab_convert_params { struct sidtab_convert_params {
int (*func)(struct context *oldc, struct context *newc, void *args); int (*func)(struct context *oldc, struct context *newc, void *args, gfp_t gfp_flags);
void *args; void *args;
struct sidtab *target; struct sidtab *target;
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment