From: "Konstantin Meskhidze (A)" <konstantin.meskhidze@huawei.com>
To: "Mickaël Salaün" <mic@digikod.net>
Cc: <willemdebruijn.kernel@gmail.com>, <gnoack3000@gmail.com>,
<linux-security-module@vger.kernel.org>, <netdev@vger.kernel.org>,
<netfilter-devel@vger.kernel.org>, <yusongping@huawei.com>,
<artem.kuzin@huawei.com>
Subject: Re: [PATCH v10 05/13] landlock: Refactor merge/inherit_ruleset functions
Date: Thu, 20 Apr 2023 14:46:38 +0300 [thread overview]
Message-ID: <13792f4e-3df7-9cc0-734a-285f95dbe7ca@huawei.com> (raw)
In-Reply-To: <8b2f2e0f-0a95-ef87-7eb2-286e75a62e2c@digikod.net>
4/16/2023 7:09 PM, Mickaël Salaün пишет:
>
> On 23/03/2023 09:52, Konstantin Meskhidze wrote:
>> Refactor merge_ruleset() and inherit_ruleset() functions to support
>> new rule types. This patch adds merge_tree() and inherit_tree()
>> helpers. They use a specific ruleset's red-black tree according to
>> a key type argument.
>>
>> Signed-off-by: Konstantin Meskhidze <konstantin.meskhidze@huawei.com>
>> ---
>>
>> Changes since v9:
>> * None
>>
>> Changes since v8:
>> * Refactors commit message.
>> * Minor fixes.
>>
>> 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 | 110 ++++++++++++++++++++++++------------
>> 1 file changed, 73 insertions(+), 37 deletions(-)
>>
>> diff --git a/security/landlock/ruleset.c b/security/landlock/ruleset.c
>> index d3859d5e7306..2579c9bbedbc 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,23 +326,52 @@ 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)) {
>> err = -EINVAL;
>> - goto out_unlock;
>
> This should be replaced with `return -EINVAL;` and the `{` `}` after the
> if condition are not needed anymore.
>
Ok. Will be changed.
>
>> }
>> if (WARN_ON_ONCE(walker_rule->layers[0].level != 0)) {
>> err = -EINVAL;
>> - goto out_unlock;
>
> ditto
Got it.
>
>> }
>> layers[0].access = walker_rule->layers[0].access;
>>
>> 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);
>> @@ -364,43 +379,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(&child->lock);
>>
>> - parent_root = get_root(parent, LANDLOCK_KEY_INODE);
>> + parent_root = get_root(parent, key_type);
>> if (IS_ERR(parent_root))
>> return PTR_ERR(parent_root);
>>
>> - /* Locks @child first because we are its only owner. */
>> - mutex_lock(&child->lock);
>> - mutex_lock_nested(&parent->lock, SINGLE_DEPTH_NESTING);
>> -
>> - /* Copies the @parent tree. */
>> + /* Copies the @parent inode or network tree. */
>> rbtree_postorder_for_each_entry_safe(walker_rule, next_rule,
>> parent_root, node) {
>> const struct landlock_id id = {
>> .key = walker_rule->key,
>> - .type = LANDLOCK_KEY_INODE,
>> + .type = key_type,
>> };
>> +
>> err = insert_rule(child, id, &walker_rule->layers,
>> walker_rule->num_layers);
>> if (err)
>> - goto out_unlock;
>> + return err;
>> }
>> + return err;
>> +}
>> +
>> +static int inherit_ruleset(struct landlock_ruleset *const parent,
>> + struct landlock_ruleset *const child)
>> +{
>> + int err = 0;
>> +
>> + might_sleep();
>> + if (!parent)
>> + return 0;
>> +
>> + /* Locks @child first because we are its only owner. */
>> + mutex_lock(&child->lock);
>> + mutex_lock_nested(&parent->lock, SINGLE_DEPTH_NESTING);
>> +
>> + /* Copies the @parent inode tree. */
>> + err = inherit_tree(parent, child, LANDLOCK_KEY_INODE);
>> + if (err)
>> + goto out_unlock;
>>
>> if (WARN_ON_ONCE(child->num_layers <= parent->num_layers)) {
>> err = -EINVAL;
>> goto out_unlock;
>> }
>> - /* Copies the parent layer stack and leaves a space for the new layer. */
>> + /*
>> + * Copies the parent layer stack and leaves a space
>> + * for the new layer.
>> + */
>> memcpy(child->access_masks, parent->access_masks,
>> flex_array_size(parent, access_masks, parent->num_layers));
>>
>> --
>> 2.25.1
>>
> .
next prev parent reply other threads:[~2023-04-20 11:46 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-03-23 8:52 [PATCH v10 00/13] Network support for Landlock Konstantin Meskhidze
2023-03-23 8:52 ` [PATCH v10 01/13] landlock: Make ruleset's access masks more generic Konstantin Meskhidze
2023-03-23 8:52 ` [PATCH v10 02/13] landlock: Allow filesystem layout changes for domains without such rule type Konstantin Meskhidze
2023-04-16 16:09 ` Mickaël Salaün
2023-04-20 11:42 ` Konstantin Meskhidze (A)
2023-04-20 17:32 ` Mickaël Salaün
2023-04-21 7:54 ` Konstantin Meskhidze (A)
2023-03-23 8:52 ` [PATCH v10 03/13] landlock: Remove unnecessary inlining Konstantin Meskhidze
2023-04-16 16:09 ` Mickaël Salaün
2023-04-20 11:45 ` Konstantin Meskhidze (A)
2023-03-23 8:52 ` [PATCH v10 04/13] landlock: Refactor landlock_find_rule/insert_rule Konstantin Meskhidze
2023-03-23 8:52 ` [PATCH v10 05/13] landlock: Refactor merge/inherit_ruleset functions Konstantin Meskhidze
2023-04-16 16:09 ` Mickaël Salaün
2023-04-20 11:46 ` Konstantin Meskhidze (A) [this message]
2023-03-23 8:52 ` [PATCH v10 06/13] landlock: Move and rename layer helpers Konstantin Meskhidze
2023-03-23 8:52 ` [PATCH v10 07/13] landlock: Refactor " Konstantin Meskhidze
2023-04-16 16:11 ` Mickaël Salaün
2023-04-20 16:05 ` Konstantin Meskhidze (A)
2023-03-23 8:52 ` [PATCH v10 08/13] landlock: Refactor landlock_add_rule() syscall Konstantin Meskhidze
2023-03-23 8:52 ` [PATCH v10 09/13] landlock: Add network rules and TCP hooks support Konstantin Meskhidze
2023-03-31 17:24 ` Mickaël Salaün
2023-03-31 17:30 ` Mickaël Salaün
2023-04-04 9:33 ` Konstantin Meskhidze (A)
2023-04-04 9:31 ` Konstantin Meskhidze (A)
2023-04-04 16:42 ` Mickaël Salaün
2023-04-04 17:02 ` Mickaël Salaün
2023-04-05 19:19 ` Konstantin Meskhidze (A)
2023-04-06 10:31 ` Mickaël Salaün
2023-04-06 10:37 ` Konstantin Meskhidze (A)
2023-04-05 17:42 ` Konstantin Meskhidze (A)
2023-04-06 10:28 ` Mickaël Salaün
2023-04-06 10:30 ` Konstantin Meskhidze (A)
2023-04-16 16:11 ` Mickaël Salaün
2023-04-21 9:39 ` Konstantin Meskhidze (A)
2023-04-26 14:15 ` Mickaël Salaün
2023-03-23 8:52 ` [PATCH v10 10/13] selftests/landlock: Share enforce_ruleset() Konstantin Meskhidze
2023-04-16 16:12 ` Mickaël Salaün
2023-04-20 16:06 ` Konstantin Meskhidze (A)
2023-03-23 8:52 ` [PATCH v10 11/13] selftests/landlock: Add 10 new test suites dedicated to network Konstantin Meskhidze
2023-04-16 16:13 ` Mickaël Salaün
2023-04-21 10:02 ` Konstantin Meskhidze (A)
2023-04-26 19:10 ` Mickaël Salaün
2023-03-23 8:52 ` [PATCH v10 12/13] samples/landlock: Add network demo Konstantin Meskhidze
2023-04-16 16:13 ` Mickaël Salaün
2023-04-21 10:04 ` Konstantin Meskhidze (A)
2023-03-23 8:52 ` [PATCH v10 13/13] landlock: Document Landlock's network support Konstantin Meskhidze
2023-04-16 16:13 ` Mickaël Salaün
2023-04-21 10:07 ` Konstantin Meskhidze (A)
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=13792f4e-3df7-9cc0-734a-285f95dbe7ca@huawei.com \
--to=konstantin.meskhidze@huawei.com \
--cc=artem.kuzin@huawei.com \
--cc=gnoack3000@gmail.com \
--cc=linux-security-module@vger.kernel.org \
--cc=mic@digikod.net \
--cc=netdev@vger.kernel.org \
--cc=netfilter-devel@vger.kernel.org \
--cc=willemdebruijn.kernel@gmail.com \
--cc=yusongping@huawei.com \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox