@@ -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