]> Git Repo - linux.git/commitdiff
security: Return xattr name from security_dentry_init_security()
authorVivek Goyal <[email protected]>
Tue, 12 Oct 2021 13:23:07 +0000 (09:23 -0400)
committerPaul Moore <[email protected]>
Wed, 20 Oct 2021 12:17:08 +0000 (08:17 -0400)
Right now security_dentry_init_security() only supports single security
label and is used by SELinux only. There are two users of this hook,
namely ceph and nfs.

NFS does not care about xattr name. Ceph hardcodes the xattr name to
security.selinux (XATTR_NAME_SELINUX).

I am making changes to fuse/virtiofs to send security label to virtiofsd
and I need to send xattr name as well. I also hardcoded the name of
xattr to security.selinux.

Stephen Smalley suggested that it probably is a good idea to modify
security_dentry_init_security() to also return name of xattr so that
we can avoid this hardcoding in the callers.

This patch adds a new parameter "const char **xattr_name" to
security_dentry_init_security() and LSM puts the name of xattr
too if caller asked for it (xattr_name != NULL).

Signed-off-by: Vivek Goyal <[email protected]>
Reviewed-by: Jeff Layton <[email protected]>
Reviewed-by: Christian Brauner <[email protected]>
Acked-by: James Morris <[email protected]>
[PM: fixed typos in the commit description]
Signed-off-by: Paul Moore <[email protected]>
fs/ceph/xattr.c
fs/nfs/nfs4proc.c
include/linux/lsm_hook_defs.h
include/linux/lsm_hooks.h
include/linux/security.h
security/security.c
security/selinux/hooks.c

index 159a1ffa4f4b887ad421828b6555e6e47f8e4b0c..fcf7dfdecf96603fe56085460dc68a6b7d34b6fd 100644 (file)
@@ -1311,7 +1311,7 @@ int ceph_security_init_secctx(struct dentry *dentry, umode_t mode,
        int err;
 
        err = security_dentry_init_security(dentry, mode, &dentry->d_name,
-                                           &as_ctx->sec_ctx,
+                                           &name, &as_ctx->sec_ctx,
                                            &as_ctx->sec_ctxlen);
        if (err < 0) {
                WARN_ON_ONCE(err != -EOPNOTSUPP);
@@ -1335,7 +1335,6 @@ int ceph_security_init_secctx(struct dentry *dentry, umode_t mode,
         * It only supports single security module and only selinux has
         * dentry_init_security hook.
         */
-       name = XATTR_NAME_SELINUX;
        name_len = strlen(name);
        err = ceph_pagelist_reserve(pagelist,
                                    4 * 2 + name_len + as_ctx->sec_ctxlen);
index e1214bb6b7ee5aa73e0612fa20fa2a13a15b546f..459860aa8fd7cd94895fe1bdb2e4d4b3ced18585 100644 (file)
@@ -127,7 +127,8 @@ nfs4_label_init_security(struct inode *dir, struct dentry *dentry,
                return NULL;
 
        err = security_dentry_init_security(dentry, sattr->ia_mode,
-                               &dentry->d_name, (void **)&label->label, &label->len);
+                               &dentry->d_name, NULL,
+                               (void **)&label->label, &label->len);
        if (err == 0)
                return label;
 
index 4c7ed0268ce32ed2feff9a2ab8d714b0592cb3f5..a9ac70ae01abf1420435e9e6b35e6db1aa67398d 100644 (file)
@@ -83,7 +83,8 @@ LSM_HOOK(int, 0, sb_add_mnt_opt, const char *option, const char *val,
 LSM_HOOK(int, 0, move_mount, const struct path *from_path,
         const struct path *to_path)
 LSM_HOOK(int, 0, dentry_init_security, struct dentry *dentry,
-        int mode, const struct qstr *name, void **ctx, u32 *ctxlen)
+        int mode, const struct qstr *name, const char **xattr_name,
+        void **ctx, u32 *ctxlen)
 LSM_HOOK(int, 0, dentry_create_files_as, struct dentry *dentry, int mode,
         struct qstr *name, const struct cred *old, struct cred *new)
 
index 528554e9b90c36c2dbdc06ce582b52bd87c60240..0bada4df23fce35aa24d0596a3980388873592ab 100644 (file)
  *     @dentry dentry to use in calculating the context.
  *     @mode mode used to determine resource type.
  *     @name name of the last path component used to create file
+ *     @xattr_name pointer to place the pointer to security xattr name.
+ *                 Caller does not have to free the resulting pointer. Its
+ *                 a pointer to static string.
  *     @ctx pointer to place the pointer to the resulting context in.
  *     @ctxlen point to place the length of the resulting context.
  * @dentry_create_files_as:
index cc6d393583368e38d6ed51dc414fe4dfa710abde..7e0ba63b5dde270ddbff4b972ab60df26e407ae9 100644 (file)
@@ -317,8 +317,9 @@ int security_add_mnt_opt(const char *option, const char *val,
                                int len, void **mnt_opts);
 int security_move_mount(const struct path *from_path, const struct path *to_path);
 int security_dentry_init_security(struct dentry *dentry, int mode,
-                                       const struct qstr *name, void **ctx,
-                                       u32 *ctxlen);
+                                 const struct qstr *name,
+                                 const char **xattr_name, void **ctx,
+                                 u32 *ctxlen);
 int security_dentry_create_files_as(struct dentry *dentry, int mode,
                                        struct qstr *name,
                                        const struct cred *old,
@@ -739,6 +740,7 @@ static inline void security_inode_free(struct inode *inode)
 static inline int security_dentry_init_security(struct dentry *dentry,
                                                 int mode,
                                                 const struct qstr *name,
+                                                const char **xattr_name,
                                                 void **ctx,
                                                 u32 *ctxlen)
 {
index d9d53c1e466ab58789474049ca7beb700d14626d..95e30fadba78956d2ba06e47baef02f89de8a06c 100644 (file)
@@ -1052,11 +1052,12 @@ void security_inode_free(struct inode *inode)
 }
 
 int security_dentry_init_security(struct dentry *dentry, int mode,
-                                       const struct qstr *name, void **ctx,
-                                       u32 *ctxlen)
+                                 const struct qstr *name,
+                                 const char **xattr_name, void **ctx,
+                                 u32 *ctxlen)
 {
        return call_int_hook(dentry_init_security, -EOPNOTSUPP, dentry, mode,
-                               name, ctx, ctxlen);
+                               name, xattr_name, ctx, ctxlen);
 }
 EXPORT_SYMBOL(security_dentry_init_security);
 
index 6f08cd2fc6a89c442d898f6226505367d46e430e..1af2fbc0858890b3b6672ac7e7205b6a3532de2e 100644 (file)
@@ -2927,7 +2927,8 @@ static void selinux_inode_free_security(struct inode *inode)
 }
 
 static int selinux_dentry_init_security(struct dentry *dentry, int mode,
-                                       const struct qstr *name, void **ctx,
+                                       const struct qstr *name,
+                                       const char **xattr_name, void **ctx,
                                        u32 *ctxlen)
 {
        u32 newsid;
@@ -2940,6 +2941,9 @@ static int selinux_dentry_init_security(struct dentry *dentry, int mode,
        if (rc)
                return rc;
 
+       if (xattr_name)
+               *xattr_name = XATTR_NAME_SELINUX;
+
        return security_sid_to_context(&selinux_state, newsid, (char **)ctx,
                                       ctxlen);
 }
This page took 0.089221 seconds and 4 git commands to generate.