Skip to content

Commit 2cd7cd6

Browse files
committed
landlock: Create find_rule() from unmask_layers()
This refactoring will be useful in a following commit. Reviewed-by: Paul Moore <[email protected]> Link: https://lore.kernel.org/r/[email protected] Cc: [email protected] Signed-off-by: Mickaël Salaün <[email protected]>
1 parent 75c542d commit 2cd7cd6

File tree

1 file changed

+28
-13
lines changed
  • security/landlock

1 file changed

+28
-13
lines changed

security/landlock/fs.c

+28-13
Original file line numberDiff line numberDiff line change
@@ -183,23 +183,36 @@ int landlock_append_fs_rule(struct landlock_ruleset *const ruleset,
183183

184184
/* Access-control management */
185185

186-
static inline layer_mask_t
187-
unmask_layers(const struct landlock_ruleset *const domain,
188-
const struct path *const path, const access_mask_t access_request,
189-
layer_mask_t layer_mask)
186+
/*
187+
* The lifetime of the returned rule is tied to @domain.
188+
*
189+
* Returns NULL if no rule is found or if @dentry is negative.
190+
*/
191+
static inline const struct landlock_rule *
192+
find_rule(const struct landlock_ruleset *const domain,
193+
const struct dentry *const dentry)
190194
{
191195
const struct landlock_rule *rule;
192196
const struct inode *inode;
193-
size_t i;
194197

195-
if (d_is_negative(path->dentry))
196-
/* Ignore nonexistent leafs. */
197-
return layer_mask;
198-
inode = d_backing_inode(path->dentry);
198+
/* Ignores nonexistent leafs. */
199+
if (d_is_negative(dentry))
200+
return NULL;
201+
202+
inode = d_backing_inode(dentry);
199203
rcu_read_lock();
200204
rule = landlock_find_rule(
201205
domain, rcu_dereference(landlock_inode(inode)->object));
202206
rcu_read_unlock();
207+
return rule;
208+
}
209+
210+
static inline layer_mask_t unmask_layers(const struct landlock_rule *const rule,
211+
const access_mask_t access_request,
212+
layer_mask_t layer_mask)
213+
{
214+
size_t layer_level;
215+
203216
if (!rule)
204217
return layer_mask;
205218

@@ -210,8 +223,9 @@ unmask_layers(const struct landlock_ruleset *const domain,
210223
* the remaining layers for each inode, from the first added layer to
211224
* the last one.
212225
*/
213-
for (i = 0; i < rule->num_layers; i++) {
214-
const struct landlock_layer *const layer = &rule->layers[i];
226+
for (layer_level = 0; layer_level < rule->num_layers; layer_level++) {
227+
const struct landlock_layer *const layer =
228+
&rule->layers[layer_level];
215229
const layer_mask_t layer_bit = BIT_ULL(layer->level - 1);
216230

217231
/* Checks that the layer grants access to the full request. */
@@ -269,8 +283,9 @@ static int check_access_path(const struct landlock_ruleset *const domain,
269283
while (true) {
270284
struct dentry *parent_dentry;
271285

272-
layer_mask = unmask_layers(domain, &walker_path, access_request,
273-
layer_mask);
286+
layer_mask =
287+
unmask_layers(find_rule(domain, walker_path.dentry),
288+
access_request, layer_mask);
274289
if (layer_mask == 0) {
275290
/* Stops when a rule from each layer grants access. */
276291
allowed = true;

0 commit comments

Comments
 (0)