[PATCH v8 03/12] landlock: Refactor merge/inherit_ruleset functions
Konstantin Meskhidze (A)
konstantin.meskhidze at huawei.com
Mon Nov 28 03:07:41 UTC 2022
11/17/2022 9:41 PM, Mickaël Salaün пишет:
>
> On 21/10/2022 17:26, Konstantin Meskhidze wrote:
>> Refactors merge_ruleset() and inherit_ruleset() functions to support
>
> Refactor…
Ok. Thanks.
>
>> new rule types. This patch adds merge_tree() and inherit_tree()
>> helpers.
>
>> Each has key_type argument to choose a particular rb_tree
>
> They use a specific ruleset's red-black tree according to a key type
> argument.
Got it.
>
>> structure in a ruleset.
>>
>> Signed-off-by: Konstantin Meskhidze <konstantin.meskhidze at huawei.com>
>> ---
>>
>> Changes since v7:
>> * Adds missed lockdep_assert_held it inherit_tree() and merge_tree().
>> * Fixes comment.
>>
>> Changes since v6:
>> * Refactors merge_ruleset() and inherit_ruleset() functions to support
>> new rule types.
>> * Renames tree_merge() to merge_tree() (and reorder arguments), and
>> tree_copy() to inherit_tree().
>>
>> Changes since v5:
>> * Refactors some logic errors.
>> * Formats code with clang-format-14.
>>
>> Changes since v4:
>> * None
>>
>> ---
>> security/landlock/ruleset.c | 108 ++++++++++++++++++++++++------------
>> 1 file changed, 73 insertions(+), 35 deletions(-)
>>
>> diff --git a/security/landlock/ruleset.c b/security/landlock/ruleset.c
>> index 41de17d1869e..961ffe0c709e 100644
>> --- a/security/landlock/ruleset.c
>> +++ b/security/landlock/ruleset.c
>> @@ -302,36 +302,22 @@ static void put_hierarchy(struct landlock_hierarchy *hierarchy)
>> }
>> }
>>
>> -static int merge_ruleset(struct landlock_ruleset *const dst,
>> - struct landlock_ruleset *const src)
>> +static int merge_tree(struct landlock_ruleset *const dst,
>> + struct landlock_ruleset *const src,
>> + const enum landlock_key_type key_type)
>> {
>> struct landlock_rule *walker_rule, *next_rule;
>> struct rb_root *src_root;
>> int err = 0;
>>
>> might_sleep();
>> - /* Should already be checked by landlock_merge_ruleset() */
>> - if (WARN_ON_ONCE(!src))
>> - return 0;
>> - /* Only merge into a domain. */
>> - if (WARN_ON_ONCE(!dst || !dst->hierarchy))
>> - return -EINVAL;
>> + lockdep_assert_held(&dst->lock);
>> + lockdep_assert_held(&src->lock);
>>
>> - src_root = get_root(src, LANDLOCK_KEY_INODE);
>> + src_root = get_root(src, key_type);
>> if (IS_ERR(src_root))
>> return PTR_ERR(src_root);
>>
>> - /* Locks @dst first because we are its only owner. */
>> - mutex_lock(&dst->lock);
>> - mutex_lock_nested(&src->lock, SINGLE_DEPTH_NESTING);
>> -
>> - /* Stacks the new layer. */
>> - if (WARN_ON_ONCE(src->num_layers != 1 || dst->num_layers < 1)) {
>> - err = -EINVAL;
>> - goto out_unlock;
>> - }
>> - dst->access_masks[dst->num_layers - 1] = src->access_masks[0];
>> -
>> /* Merges the @src tree. */
>> rbtree_postorder_for_each_entry_safe(walker_rule, next_rule, src_root,
>> node) {
>> @@ -340,7 +326,7 @@ static int merge_ruleset(struct landlock_ruleset *const dst,
>> } };
>> const struct landlock_id id = {
>> .key = walker_rule->key,
>> - .type = LANDLOCK_KEY_INODE,
>> + .type = key_type,
>> };
>>
>> if (WARN_ON_ONCE(walker_rule->num_layers != 1))
>> @@ -351,8 +337,39 @@ static int merge_ruleset(struct landlock_ruleset *const dst,
>>
>> err = insert_rule(dst, id, &layers, ARRAY_SIZE(layers));
>> if (err)
>> - goto out_unlock;
>> + return err;
>> + }
>> + return err;
>> +}
>> +
>> +static int merge_ruleset(struct landlock_ruleset *const dst,
>> + struct landlock_ruleset *const src)
>> +{
>> + int err = 0;
>> +
>> + might_sleep();
>> + /* Should already be checked by landlock_merge_ruleset() */
>> + if (WARN_ON_ONCE(!src))
>> + return 0;
>> + /* Only merge into a domain. */
>> + if (WARN_ON_ONCE(!dst || !dst->hierarchy))
>> + return -EINVAL;
>> +
>> + /* Locks @dst first because we are its only owner. */
>> + mutex_lock(&dst->lock);
>> + mutex_lock_nested(&src->lock, SINGLE_DEPTH_NESTING);
>> +
>> + /* Stacks the new layer. */
>> + if (WARN_ON_ONCE(src->num_layers != 1 || dst->num_layers < 1)) {
>> + err = -EINVAL;
>> + goto out_unlock;
>> }
>> + dst->access_masks[dst->num_layers - 1] = src->access_masks[0];
>> +
>> + /* Merges the @src inode tree. */
>> + err = merge_tree(dst, src, LANDLOCK_KEY_INODE);
>> + if (err)
>> + goto out_unlock;
>>
>> out_unlock:
>> mutex_unlock(&src->lock);
>> @@ -360,43 +377,64 @@ static int merge_ruleset(struct landlock_ruleset *const dst,
>> return err;
>> }
>>
>> -static int inherit_ruleset(struct landlock_ruleset *const parent,
>> - struct landlock_ruleset *const child)
>> +static int inherit_tree(struct landlock_ruleset *const parent,
>> + struct landlock_ruleset *const child,
>> + const enum landlock_key_type key_type)
>> {
>> struct landlock_rule *walker_rule, *next_rule;
>> struct rb_root *parent_root;
>> int err = 0;
>>
>> might_sleep();
>> - if (!parent)
>> - return 0;
>> + lockdep_assert_held(&parent->lock);
>> + lockdep_assert_held(&parent->lock);
>
> lockdep_assert_held(&child->lock);
My mistake. Thanks.
> .
More information about the Linux-security-module-archive
mailing list