@@ -183,23 +183,36 @@ int landlock_append_fs_rule(struct landlock_ruleset *const ruleset,
183
183
184
184
/* Access-control management */
185
185
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 )
190
194
{
191
195
const struct landlock_rule * rule ;
192
196
const struct inode * inode ;
193
- size_t i ;
194
197
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 );
199
203
rcu_read_lock ();
200
204
rule = landlock_find_rule (
201
205
domain , rcu_dereference (landlock_inode (inode )-> object ));
202
206
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
+
203
216
if (!rule )
204
217
return layer_mask ;
205
218
@@ -210,8 +223,9 @@ unmask_layers(const struct landlock_ruleset *const domain,
210
223
* the remaining layers for each inode, from the first added layer to
211
224
* the last one.
212
225
*/
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 ];
215
229
const layer_mask_t layer_bit = BIT_ULL (layer -> level - 1 );
216
230
217
231
/* 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,
269
283
while (true) {
270
284
struct dentry * parent_dentry ;
271
285
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 );
274
289
if (layer_mask == 0 ) {
275
290
/* Stops when a rule from each layer grants access. */
276
291
allowed = true;
0 commit comments