]> git.baikalelectronics.ru Git - kernel.git/commitdiff
smack: Retrieve transmuting information in smack_inode_getsecurity()
authorRoberto Sassu <roberto.sassu@huawei.com>
Mon, 8 May 2023 17:02:33 +0000 (19:02 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 6 Oct 2023 12:56:59 +0000 (14:56 +0200)
[ Upstream commit 3a3d8fce31a49363cc31880dce5e3b0617c9c38b ]

Enhance smack_inode_getsecurity() to retrieve the value for
SMACK64TRANSMUTE from the inode security blob, similarly to SMACK64.

This helps to display accurate values in the situation where the security
labels come from mount options and not from xattrs.

Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com>
Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
security/smack/smack_lsm.c

index 1232c1d71d9f8830e77f98960bf35a0cbf17edb3..cd6a03e945eb7edbeeeb76843bf2bbde4ec700af 100644 (file)
@@ -1476,10 +1476,19 @@ static int smack_inode_getsecurity(struct user_namespace *mnt_userns,
        struct super_block *sbp;
        struct inode *ip = (struct inode *)inode;
        struct smack_known *isp;
+       struct inode_smack *ispp;
+       size_t label_len;
+       char *label = NULL;
 
-       if (strcmp(name, XATTR_SMACK_SUFFIX) == 0)
+       if (strcmp(name, XATTR_SMACK_SUFFIX) == 0) {
                isp = smk_of_inode(inode);
-       else {
+       } else if (strcmp(name, XATTR_SMACK_TRANSMUTE) == 0) {
+               ispp = smack_inode(inode);
+               if (ispp->smk_flags & SMK_INODE_TRANSMUTE)
+                       label = TRANS_TRUE;
+               else
+                       label = "";
+       } else {
                /*
                 * The rest of the Smack xattrs are only on sockets.
                 */
@@ -1501,13 +1510,18 @@ static int smack_inode_getsecurity(struct user_namespace *mnt_userns,
                        return -EOPNOTSUPP;
        }
 
+       if (!label)
+               label = isp->smk_known;
+
+       label_len = strlen(label);
+
        if (alloc) {
-               *buffer = kstrdup(isp->smk_known, GFP_KERNEL);
+               *buffer = kstrdup(label, GFP_KERNEL);
                if (*buffer == NULL)
                        return -ENOMEM;
        }
 
-       return strlen(isp->smk_known);
+       return label_len;
 }