]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
smack: always "instantiate" inode in smack_inode_init_security()
authorKonstantin Andreev <andreev@swemel.ru>
Mon, 16 Jun 2025 01:07:31 +0000 (04:07 +0300)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 18 Dec 2025 13:02:25 +0000 (14:02 +0100)
[ Upstream commit 69204f6cdb90f56b7ca27966d1080841108fc5de ]

If memory allocation for the SMACK64TRANSMUTE
xattr value fails in smack_inode_init_security(),
the SMK_INODE_INSTANT flag is not set in
(struct inode_smack *issp)->smk_flags,
leaving the inode as not "instantiated".

It does not matter if fs frees the inode
after failed smack_inode_init_security() call,
but there is no guarantee for this.

To be safe, mark the inode as "instantiated",
even if allocation of xattr values fails.

Signed-off-by: Konstantin Andreev <andreev@swemel.ru>
Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
Stable-dep-of: 78fc6a94be25 ("smack: fix bug: invalid label of unix socket file")
Signed-off-by: Sasha Levin <sashal@kernel.org>
security/smack/smack_lsm.c

index 9eefb5cfccba5ec279771f3f64dc765edb2dcc30..db2a9aa9f1a05583f7b27435f11dc4874e63d265 100644 (file)
@@ -1015,6 +1015,8 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir,
        struct task_smack *tsp = smack_cred(current_cred());
        struct inode_smack * const issp = smack_inode(inode);
        struct smack_known *dsp = smk_of_inode(dir);
+       int rc = 0;
+       int transflag = 0;
        bool trans_cred;
        bool trans_rule;
 
@@ -1043,18 +1045,20 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir,
                        issp->smk_inode = dsp;
 
                if (S_ISDIR(inode->i_mode)) {
-                       issp->smk_flags |= SMK_INODE_TRANSMUTE;
+                       transflag = SMK_INODE_TRANSMUTE;
 
                        if (xattr_dupval(xattrs, xattr_count,
                                XATTR_SMACK_TRANSMUTE,
                                TRANS_TRUE,
                                TRANS_TRUE_SIZE
                        ))
-                               return -ENOMEM;
+                               rc = -ENOMEM;
                }
        }
 
-       issp->smk_flags |= SMK_INODE_INSTANT;
+       issp->smk_flags |= (SMK_INODE_INSTANT | transflag);
+       if (rc)
+               return rc;
 
        return xattr_dupval(xattrs, xattr_count,
                            XATTR_SMACK_SUFFIX,