Merge tag 'selinux-pr-20221212' of git://git.kernel.org/pub/scm/linux/kernel/git...
[platform/kernel/linux-rpi.git] / security / selinux / ss / sidtab.c
index db5cce3..38d2517 100644 (file)
@@ -18,6 +18,7 @@
 #include "flask.h"
 #include "security.h"
 #include "sidtab.h"
+#include "services.h"
 
 struct sidtab_str_cache {
        struct rcu_head rcu_member;
@@ -292,7 +293,6 @@ int sidtab_context_to_sid(struct sidtab *s, struct context *context,
        }
 
        count = s->count;
-       convert = s->convert;
 
        /* bail out if we already reached max entries */
        rc = -EOVERFLOW;
@@ -316,25 +316,29 @@ int sidtab_context_to_sid(struct sidtab *s, struct context *context,
         * if we are building a new sidtab, we need to convert the context
         * and insert it there as well
         */
+       convert = s->convert;
        if (convert) {
+               struct sidtab *target = convert->target;
+
                rc = -ENOMEM;
-               dst_convert = sidtab_do_lookup(convert->target, count, 1);
+               dst_convert = sidtab_do_lookup(target, count, 1);
                if (!dst_convert) {
                        context_destroy(&dst->context);
                        goto out_unlock;
                }
 
-               rc = convert->func(context, &dst_convert->context,
-                                  convert->args, GFP_ATOMIC);
+               rc = services_convert_context(convert->args,
+                                             context, &dst_convert->context,
+                                             GFP_ATOMIC);
                if (rc) {
                        context_destroy(&dst->context);
                        goto out_unlock;
                }
                dst_convert->sid = index_to_sid(count);
                dst_convert->hash = context_compute_hash(&dst_convert->context);
-               convert->target->count = count + 1;
+               target->count = count + 1;
 
-               hash_add_rcu(convert->target->context_to_sid,
+               hash_add_rcu(target->context_to_sid,
                             &dst_convert->list, dst_convert->hash);
        }
 
@@ -402,9 +406,10 @@ static int sidtab_convert_tree(union sidtab_entry_inner *edst,
                }
                i = 0;
                while (i < SIDTAB_LEAF_ENTRIES && *pos < count) {
-                       rc = convert->func(&esrc->ptr_leaf->entries[i].context,
-                                          &edst->ptr_leaf->entries[i].context,
-                                          convert->args, GFP_KERNEL);
+                       rc = services_convert_context(convert->args,
+                                       &esrc->ptr_leaf->entries[i].context,
+                                       &edst->ptr_leaf->entries[i].context,
+                                       GFP_KERNEL);
                        if (rc)
                                return rc;
                        (*pos)++;