Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 416a5d03 authored by Eric Biggers's avatar Eric Biggers Committed by Greg Kroah-Hartman
Browse files

smack: use GFP_NOFS while holding inode_smack::smk_lock



commit e5bfad3d7acc5702f32aafeb388362994f4d7bd0 upstream.

inode_smack::smk_lock is taken during smack_d_instantiate(), which is
called during a filesystem transaction when creating a file on ext4.
Therefore to avoid a deadlock, all code that takes this lock must use
GFP_NOFS, to prevent memory reclaim from waiting for the filesystem
transaction to complete.

Reported-by: default avatar <syzbot+0eefc1e06a77d327a056@syzkaller.appspotmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: default avatarEric Biggers <ebiggers@google.com>
Signed-off-by: default avatarCasey Schaufler <casey@schaufler-ca.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent ca2cf054
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -469,7 +469,7 @@ char *smk_parse_smack(const char *string, int len)
	if (i == 0 || i >= SMK_LONGLABEL)
		return ERR_PTR(-EINVAL);

	smack = kzalloc(i + 1, GFP_KERNEL);
	smack = kzalloc(i + 1, GFP_NOFS);
	if (smack == NULL)
		return ERR_PTR(-ENOMEM);

@@ -504,7 +504,7 @@ int smk_netlbl_mls(int level, char *catset, struct netlbl_lsm_secattr *sap,
			if ((m & *cp) == 0)
				continue;
			rc = netlbl_catmap_setbit(&sap->attr.mls.cat,
						  cat, GFP_KERNEL);
						  cat, GFP_NOFS);
			if (rc < 0) {
				netlbl_catmap_free(sap->attr.mls.cat);
				return rc;
@@ -540,7 +540,7 @@ struct smack_known *smk_import_entry(const char *string, int len)
	if (skp != NULL)
		goto freeout;

	skp = kzalloc(sizeof(*skp), GFP_KERNEL);
	skp = kzalloc(sizeof(*skp), GFP_NOFS);
	if (skp == NULL) {
		skp = ERR_PTR(-ENOMEM);
		goto freeout;
+1 −1
Original line number Diff line number Diff line
@@ -269,7 +269,7 @@ static struct smack_known *smk_fetch(const char *name, struct inode *ip,
	if (!(ip->i_opflags & IOP_XATTR))
		return ERR_PTR(-EOPNOTSUPP);

	buffer = kzalloc(SMK_LONGLABEL, GFP_KERNEL);
	buffer = kzalloc(SMK_LONGLABEL, GFP_NOFS);
	if (buffer == NULL)
		return ERR_PTR(-ENOMEM);