Skip to content

Commit 1b42503

Browse files
ebiggersgregkh
authored andcommitted
smack: use GFP_NOFS while holding inode_smack::smk_lock
commit e5bfad3 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: syzbot+0eefc1e06a77d327a056@syzkaller.appspotmail.com Cc: stable@vger.kernel.org Signed-off-by: Eric Biggers <ebiggers@google.com> Signed-off-by: Casey Schaufler <casey@schaufler-ca.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
1 parent ef9744a commit 1b42503

2 files changed

Lines changed: 4 additions & 4 deletions

File tree

security/smack/smack_access.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -469,7 +469,7 @@ char *smk_parse_smack(const char *string, int len)
469469
if (i == 0 || i >= SMK_LONGLABEL)
470470
return ERR_PTR(-EINVAL);
471471

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

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

543-
skp = kzalloc(sizeof(*skp), GFP_KERNEL);
543+
skp = kzalloc(sizeof(*skp), GFP_NOFS);
544544
if (skp == NULL) {
545545
skp = ERR_PTR(-ENOMEM);
546546
goto freeout;

security/smack/smack_lsm.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -270,7 +270,7 @@ static struct smack_known *smk_fetch(const char *name, struct inode *ip,
270270
if (!(ip->i_opflags & IOP_XATTR))
271271
return ERR_PTR(-EOPNOTSUPP);
272272

273-
buffer = kzalloc(SMK_LONGLABEL, GFP_KERNEL);
273+
buffer = kzalloc(SMK_LONGLABEL, GFP_NOFS);
274274
if (buffer == NULL)
275275
return ERR_PTR(-ENOMEM);
276276

0 commit comments

Comments
 (0)