@@ -215,60 +215,6 @@ find_rule(const struct landlock_ruleset *const domain,
215
215
return rule ;
216
216
}
217
217
218
- /*
219
- * @layer_masks is read and may be updated according to the access request and
220
- * the matching rule.
221
- *
222
- * Returns true if the request is allowed (i.e. relevant layer masks for the
223
- * request are empty).
224
- */
225
- static inline bool
226
- unmask_layers (const struct landlock_rule * const rule ,
227
- const access_mask_t access_request ,
228
- layer_mask_t (* const layer_masks )[LANDLOCK_NUM_ACCESS_FS ])
229
- {
230
- size_t layer_level ;
231
-
232
- if (!access_request || !layer_masks )
233
- return true;
234
- if (!rule )
235
- return false;
236
-
237
- /*
238
- * An access is granted if, for each policy layer, at least one rule
239
- * encountered on the pathwalk grants the requested access,
240
- * regardless of its position in the layer stack. We must then check
241
- * the remaining layers for each inode, from the first added layer to
242
- * the last one. When there is multiple requested accesses, for each
243
- * policy layer, the full set of requested accesses may not be granted
244
- * by only one rule, but by the union (binary OR) of multiple rules.
245
- * E.g. /a/b <execute> + /a <read> => /a/b <execute + read>
246
- */
247
- for (layer_level = 0 ; layer_level < rule -> num_layers ; layer_level ++ ) {
248
- const struct landlock_layer * const layer =
249
- & rule -> layers [layer_level ];
250
- const layer_mask_t layer_bit = BIT_ULL (layer -> level - 1 );
251
- const unsigned long access_req = access_request ;
252
- unsigned long access_bit ;
253
- bool is_empty ;
254
-
255
- /*
256
- * Records in @layer_masks which layer grants access to each
257
- * requested access.
258
- */
259
- is_empty = true;
260
- for_each_set_bit (access_bit , & access_req ,
261
- ARRAY_SIZE (* layer_masks )) {
262
- if (layer -> access & BIT_ULL (access_bit ))
263
- (* layer_masks )[access_bit ] &= ~layer_bit ;
264
- is_empty = is_empty && !(* layer_masks )[access_bit ];
265
- }
266
- if (is_empty )
267
- return true;
268
- }
269
- return false;
270
- }
271
-
272
218
/*
273
219
* Allows access to pseudo filesystems that will never be mountable (e.g.
274
220
* sockfs, pipefs), but can still be reachable through
@@ -293,50 +239,6 @@ get_raw_handled_fs_accesses(const struct landlock_ruleset *const domain)
293
239
return access_dom ;
294
240
}
295
241
296
- /**
297
- * init_layer_masks - Initialize layer masks from an access request
298
- *
299
- * Populates @layer_masks such that for each access right in @access_request,
300
- * the bits for all the layers are set where this access right is handled.
301
- *
302
- * @domain: The domain that defines the current restrictions.
303
- * @access_request: The requested access rights to check.
304
- * @layer_masks: The layer masks to populate.
305
- *
306
- * Returns: An access mask where each access right bit is set which is handled
307
- * in any of the active layers in @domain.
308
- */
309
- static inline access_mask_t
310
- init_layer_masks (const struct landlock_ruleset * const domain ,
311
- const access_mask_t access_request ,
312
- layer_mask_t (* const layer_masks )[LANDLOCK_NUM_ACCESS_FS ])
313
- {
314
- access_mask_t handled_accesses = 0 ;
315
- size_t layer_level ;
316
-
317
- memset (layer_masks , 0 , sizeof (* layer_masks ));
318
- /* An empty access request can happen because of O_WRONLY | O_RDWR. */
319
- if (!access_request )
320
- return 0 ;
321
-
322
- /* Saves all handled accesses per layer. */
323
- for (layer_level = 0 ; layer_level < domain -> num_layers ; layer_level ++ ) {
324
- const unsigned long access_req = access_request ;
325
- unsigned long access_bit ;
326
-
327
- for_each_set_bit (access_bit , & access_req ,
328
- ARRAY_SIZE (* layer_masks )) {
329
- if (BIT_ULL (access_bit ) &
330
- landlock_get_fs_access_mask (domain , layer_level )) {
331
- (* layer_masks )[access_bit ] |=
332
- BIT_ULL (layer_level );
333
- handled_accesses |= BIT_ULL (access_bit );
334
- }
335
- }
336
- }
337
- return handled_accesses ;
338
- }
339
-
340
242
static access_mask_t
341
243
get_handled_fs_accesses (const struct landlock_ruleset * const domain )
342
244
{
@@ -540,18 +442,20 @@ static bool is_access_to_paths_allowed(
540
442
}
541
443
542
444
if (unlikely (dentry_child1 )) {
543
- unmask_layers (find_rule (domain , dentry_child1 ),
544
- init_layer_masks (domain , LANDLOCK_MASK_ACCESS_FS ,
445
+ landlock_unmask_layers (find_rule (domain , dentry_child1 ),
446
+ landlock_init_layer_masks (
447
+ domain , LANDLOCK_MASK_ACCESS_FS ,
545
448
& _layer_masks_child1 ),
546
- & _layer_masks_child1 );
449
+ & _layer_masks_child1 );
547
450
layer_masks_child1 = & _layer_masks_child1 ;
548
451
child1_is_directory = d_is_dir (dentry_child1 );
549
452
}
550
453
if (unlikely (dentry_child2 )) {
551
- unmask_layers (find_rule (domain , dentry_child2 ),
552
- init_layer_masks (domain , LANDLOCK_MASK_ACCESS_FS ,
454
+ landlock_unmask_layers (find_rule (domain , dentry_child2 ),
455
+ landlock_init_layer_masks (
456
+ domain , LANDLOCK_MASK_ACCESS_FS ,
553
457
& _layer_masks_child2 ),
554
- & _layer_masks_child2 );
458
+ & _layer_masks_child2 );
555
459
layer_masks_child2 = & _layer_masks_child2 ;
556
460
child2_is_directory = d_is_dir (dentry_child2 );
557
461
}
@@ -603,10 +507,10 @@ static bool is_access_to_paths_allowed(
603
507
}
604
508
605
509
rule = find_rule (domain , walker_path .dentry );
606
- allowed_parent1 = unmask_layers ( rule , access_masked_parent1 ,
607
- layer_masks_parent1 );
608
- allowed_parent2 = unmask_layers ( rule , access_masked_parent2 ,
609
- layer_masks_parent2 );
510
+ allowed_parent1 = landlock_unmask_layers (
511
+ rule , access_masked_parent1 , layer_masks_parent1 );
512
+ allowed_parent2 = landlock_unmask_layers (
513
+ rule , access_masked_parent2 , layer_masks_parent2 );
610
514
611
515
/* Stops when a rule from each layer grants access. */
612
516
if (allowed_parent1 && allowed_parent2 )
@@ -650,7 +554,8 @@ static inline int check_access_path(const struct landlock_ruleset *const domain,
650
554
{
651
555
layer_mask_t layer_masks [LANDLOCK_NUM_ACCESS_FS ] = {};
652
556
653
- access_request = init_layer_masks (domain , access_request , & layer_masks );
557
+ access_request =
558
+ landlock_init_layer_masks (domain , access_request , & layer_masks );
654
559
if (is_access_to_paths_allowed (domain , path , access_request ,
655
560
& layer_masks , NULL , 0 , NULL , NULL ))
656
561
return 0 ;
@@ -735,16 +640,16 @@ static bool collect_domain_accesses(
735
640
if (is_nouser_or_private (dir ))
736
641
return true;
737
642
738
- access_dom = init_layer_masks (domain , LANDLOCK_MASK_ACCESS_FS ,
739
- layer_masks_dom );
643
+ access_dom = landlock_init_layer_masks (domain , LANDLOCK_MASK_ACCESS_FS ,
644
+ layer_masks_dom );
740
645
741
646
dget (dir );
742
647
while (true) {
743
648
struct dentry * parent_dentry ;
744
649
745
650
/* Gets all layers allowing all domain accesses. */
746
- if (unmask_layers (find_rule (domain , dir ), access_dom ,
747
- layer_masks_dom )) {
651
+ if (landlock_unmask_layers (find_rule (domain , dir ), access_dom ,
652
+ layer_masks_dom )) {
748
653
/*
749
654
* Stops when all handled accesses are allowed by at
750
655
* least one rule in each layer.
@@ -857,7 +762,7 @@ static int current_check_refer_path(struct dentry *const old_dentry,
857
762
* The LANDLOCK_ACCESS_FS_REFER access right is not required
858
763
* for same-directory referer (i.e. no reparenting).
859
764
*/
860
- access_request_parent1 = init_layer_masks (
765
+ access_request_parent1 = landlock_init_layer_masks (
861
766
dom , access_request_parent1 | access_request_parent2 ,
862
767
& layer_masks_parent1 );
863
768
if (is_access_to_paths_allowed (
@@ -1234,7 +1139,8 @@ static int hook_file_open(struct file *const file)
1234
1139
1235
1140
if (is_access_to_paths_allowed (
1236
1141
dom , & file -> f_path ,
1237
- init_layer_masks (dom , full_access_request , & layer_masks ),
1142
+ landlock_init_layer_masks (dom , full_access_request ,
1143
+ & layer_masks ),
1238
1144
& layer_masks , NULL , 0 , NULL , NULL )) {
1239
1145
allowed_access = full_access_request ;
1240
1146
} else {
0 commit comments