Smack: Memory leak in smack_fs_context_submount()

Casey Schaufler casey at schaufler-ca.com
Mon Sep 15 15:49:07 UTC 2025


The mount options for Smack should be pointers into the global Smack label
list. smack_fs_context_submount() allocates copies of the labels. These
will never be freed. Change the code to save the pointers instead.

Fixes: d80a8f1b58c2 (vfs, security: Fix automount superblock LSM init problem, preventing NFS sb sharing)
Signed-off-by: Casey Schaufler <casey at schaufler-ca.com>
---
 security/smack/smack_lsm.c | 31 +++++++++----------------------
 1 file changed, 9 insertions(+), 22 deletions(-)

diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
index adf1c542d213..4c002e55d4f6 100644
--- a/security/smack/smack_lsm.c
+++ b/security/smack/smack_lsm.c
@@ -630,31 +630,18 @@ static int smack_fs_context_submount(struct fs_context *fc,
 	sbsp = smack_superblock(reference);
 	isp = smack_inode(reference->s_root->d_inode);
 
-	if (sbsp->smk_default) {
-		ctx->fsdefault = kstrdup(sbsp->smk_default->smk_known, GFP_KERNEL);
-		if (!ctx->fsdefault)
-			return -ENOMEM;
-	}
+	if (sbsp->smk_default)
+		ctx->fsdefault = sbsp->smk_default->smk_known;
 
-	if (sbsp->smk_floor) {
-		ctx->fsfloor = kstrdup(sbsp->smk_floor->smk_known, GFP_KERNEL);
-		if (!ctx->fsfloor)
-			return -ENOMEM;
-	}
+	if (sbsp->smk_floor)
+		ctx->fsfloor = sbsp->smk_floor->smk_known;
 
-	if (sbsp->smk_hat) {
-		ctx->fshat = kstrdup(sbsp->smk_hat->smk_known, GFP_KERNEL);
-		if (!ctx->fshat)
-			return -ENOMEM;
-	}
+	if (sbsp->smk_hat)
+		ctx->fshat = sbsp->smk_hat->smk_known;
+
+	if ((isp->smk_flags & SMK_INODE_TRANSMUTE) && sbsp->smk_root)
+		ctx->fstransmute = sbsp->smk_root->smk_known;
 
-	if (isp->smk_flags & SMK_INODE_TRANSMUTE) {
-		if (sbsp->smk_root) {
-			ctx->fstransmute = kstrdup(sbsp->smk_root->smk_known, GFP_KERNEL);
-			if (!ctx->fstransmute)
-				return -ENOMEM;
-		}
-	}
 	return 0;
 }
 




More information about the Linux-security-module-archive mailing list