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

Commit 1e4c7ce0 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 128373cc
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -474,7 +474,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);

@@ -545,7 +545,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
@@ -268,7 +268,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);