Add a comment to these operations that cannot use the _light version of override_creds()/revert_creds(), because during the critical section the struct cred .usage counter might be modified. Signed-off-by: Vinicius Costa Gomes <vinicius.gomes@xxxxxxxxx> --- fs/overlayfs/copy_up.c | 6 +++++- fs/overlayfs/dir.c | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/fs/overlayfs/copy_up.c b/fs/overlayfs/copy_up.c index a5ef2005a2cc..7dec275e08cd 100644 --- a/fs/overlayfs/copy_up.c +++ b/fs/overlayfs/copy_up.c @@ -718,8 +718,12 @@ static int ovl_prep_cu_creds(struct dentry *dentry, struct ovl_cu_creds *cc) if (err < 0) return err; - if (cc->new) + if (cc->new) { + /* Do not use the _light version, the credentials + * ->usage might be modified. + */ cc->old = override_creds(cc->new); + } return 0; } diff --git a/fs/overlayfs/dir.c b/fs/overlayfs/dir.c index ab65e98a1def..851945904385 100644 --- a/fs/overlayfs/dir.c +++ b/fs/overlayfs/dir.c @@ -584,6 +584,7 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode, const struct cred *old_cred; struct dentry *parent = dentry->d_parent; + /* Do not use the _light version, cred->usage might be modified */ old_cred = ovl_override_creds(dentry->d_sb); /* @@ -1159,6 +1160,7 @@ static int ovl_rename(struct mnt_idmap *idmap, struct inode *olddir, goto out; } + /* Do not use the _light version, cred->usage might be modified */ old_cred = ovl_override_creds(old->d_sb); if (!list_empty(&list)) { @@ -1314,6 +1316,7 @@ static int ovl_create_tmpfile(struct file *file, struct dentry *dentry, int flags = file->f_flags | OVL_OPEN_FLAGS; int err; + /* Do not use the _light version, cred->usage might be modified */ old_cred = ovl_override_creds(dentry->d_sb); err = ovl_setup_cred_for_create(dentry, inode, mode, old_cred); if (err) -- 2.46.0