WTF: patch "[PATCH] landlock: Define access_mask_t to enforce a consistent access" was seriously submitted to be applied to the 5.18-stable tree?
Subsystems (3)
[email protected]
maintainerThe patch below was submitted to be applied to the 5.18-stable tree.
I fail to see how this patch meets the stable kernel rules as found at Documentation/process/stable-kernel-rules.rst.
I could be totally wrong, and if so, please respond to <[email protected]> and let me know why this patch should be applied. Otherwise, it is now dropped from my patch queues, never to be seen again.
thanks,
greg k-h
------------------ original commit in Linus's tree ------------------
From 5f2ff33e10843ef51275c8611bdb7b49537aba5d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Micka=C3=ABl=20Sala=C3=BCn?= <[email protected]>
Date: Fri, 6 May 2022 18:10:51 +0200
Subject: [PATCH] landlock: Define access_mask_t to enforce a consistent access
mask size
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Create and use the access_mask_t typedef to enforce a consistent access mask size and uniformly use a 16-bits type. This will helps transition to a 32-bits value one day.
Add a build check to make sure all (filesystem) access rights fit in. This will be extended with a following commit.
security/landlock/fs.c +11 -8
@@ -152,7 +152,8 @@ static struct landlock_object *get_inode_object(struct inode *const inode)* @path: Should have been checked by get_path_from_fd(). */ int landlock_append_fs_rule (struct landlock_ruleset *const ruleset, -const struct path *const path,u32 access_rights) +const struct path *const path, +access_mask_t access_rights) {int err;struct landlock_object *object;
@@ -184,7 +185,8 @@ int landlock_append_fs_rule(struct landlock_ruleset *const ruleset,static inline u64 unmask_layers (const struct landlock_ruleset *const domain,const struct path *const path, -const u32 access_request,u64 layer_mask) +const access_mask_t access_request, +u64 layer_mask) {const struct landlock_rule *rule;const struct inode *inode;
@@ -224,7 +226,8 @@ static inline u64 unmask_layers(const struct landlock_ruleset *const domain, }static int check_access_path (const struct landlock_ruleset *const domain, -const struct path *const path,u32 access_request) +const struct path *const path, +const access_mask_t access_request) {bool allowed = false;struct path walker_path;
@@ -309,7 +312,7 @@ static int check_access_path(const struct landlock_ruleset *const domain, }static inline int current_check_access_path (const struct path *const path, -const u32 access_request) +const access_mask_t access_request) {const struct landlock_ruleset *const dom =landlock_get_current_domain ();
@@ -512,7 +515,7 @@ static int hook_sb_pivotroot(const struct path *const old_path,/* Path hooks */ -static inline u32 get_mode_access (const umode_t mode) +static inline access_mask_t get_mode_access (const umode_t mode) {switch (mode &S_IFMT ) {case S_IFLNK :
@@ -565,7 +568,7 @@ static int hook_path_link(struct dentry *const old_dentry, get_mode_access(d_backing_inode(old_dentry)->i_mode)); } -static inline u32 maybe_remove (const struct dentry *const dentry) +static inline access_mask_t maybe_remove (const struct dentry *const dentry) {if (d_is_negative (dentry))return 0 ;
@@ -635,9 +638,9 @@ static int hook_path_rmdir(const struct path *const dir,/* File hooks */ -static inline u32 get_file_access (const struct file *const file) +static inline access_mask_t get_file_access (const struct file *const file) { -u32 access =0 ; +access_mask_t access =0 ;if (file->f_mode &FMODE_READ ) {/* A directory can only be opened in read mode. */
security/landlock/fs.h +1 -1
@@ -66,6 +66,6 @@ __init void landlock_add_fs_hooks(void);int landlock_append_fs_rule (struct landlock_ruleset *const ruleset,const struct path *const path, -u32 access_hierarchy); +access_mask_t access_hierarchy);#endif /* _SECURITY_LANDLOCK_FS_H */
security/landlock/limits.h +2 -0
@@ -9,6 +9,7 @@#ifndef _SECURITY_LANDLOCK_LIMITS_H#define _SECURITY_LANDLOCK_LIMITS_H +#include <linux/bitops.h> #include <linux/limits.h> #include <uapi/linux/landlock.h>
@@ -19,6 +20,7 @@#define LANDLOCK_LAST_ACCESS_FS LANDLOCK_ACCESS_FS_MAKE_SYM#define LANDLOCK_MASK_ACCESS_FS ((LANDLOCK_LAST_ACCESS_FS << 1) - 1) +#define LANDLOCK_NUM_ACCESS_FS __const_hweight64(LANDLOCK_MASK_ACCESS_FS)/* clang-format on */
security/landlock/ruleset.c +4 -2
@@ -45,7 +45,8 @@ static struct landlock_ruleset *create_ruleset(const u32 num_layers)return new_ruleset; } -struct landlock_ruleset *landlock_create_ruleset (const u32 fs_access_mask) +struct landlock_ruleset * +landlock_create_ruleset (const access_mask_t fs_access_mask) {struct landlock_ruleset *new_ruleset;
@@ -228,7 +229,8 @@ static void build_check_layer(void)/* @ruleset must be locked by the caller. */ int landlock_insert_rule (struct landlock_ruleset *const ruleset, -struct landlock_object *const object,const u32 access) +struct landlock_object *const object, +const access_mask_t access) {struct landlock_layer layers[] = { { .access = access,
security/landlock/ruleset.h +12 -4
@@ -9,13 +9,20 @@#ifndef _SECURITY_LANDLOCK_RULESET_H#define _SECURITY_LANDLOCK_RULESET_H +#include <linux/bitops.h> +#include <linux/build_bug.h> #include <linux/mutex.h> #include <linux/rbtree.h> #include <linux/refcount.h> #include <linux/workqueue.h> +#include "limits.h" #include "object.h" +typedef u16 access_mask_t ; +/* Makes sure all filesystem access rights can be stored. */ +static_assert (BITS_PER_TYPE (access_mask_t) >=LANDLOCK_NUM_ACCESS_FS ); +/** * struct landlock_layer - Access rights for a given layer */
@@ -28,7 +35,7 @@ struct landlock_layer {* @access: Bitfield of allowed actions on the kernel object. They are * relative to the object type (e.g. %LANDLOCK_ACTION_FS_READ). */ -u16 access; +access_mask_t access; };/**
@@ -135,19 +142,20 @@ struct landlock_ruleset {* layers are set once and never changed for the * lifetime of the ruleset. */ -u16 fs_access_masks[]; +access_mask_t fs_access_masks[]; }; }; }; -struct landlock_ruleset *landlock_create_ruleset (const u32 fs_access_mask); +struct landlock_ruleset * +landlock_create_ruleset (const access_mask_t fs_access_mask);void landlock_put_ruleset (struct landlock_ruleset *const ruleset);void landlock_put_ruleset_deferred (struct landlock_ruleset *const ruleset);int landlock_insert_rule (struct landlock_ruleset *const ruleset,struct landlock_object *const object, -const u32 access); +const access_mask_t access);struct landlock_ruleset * landlock_merge_ruleset(struct landlock_ruleset *const parent,