Skip to content

Commit 711747e

Browse files
committed
ovl: pass an explicit reference of creators creds to callers
ovl_setup_cred_for_create() decrements one refcount of new creds and ovl_revert_creds() in callers decrements the last refcount. In preparation to revert_creds_light() back to caller creds, pass an explicit reference of the creators creds to the callers and drop the refcount explicitly in the callers after ovl_revert_creds(). Reviewed-by: Christian Brauner <[email protected]> Signed-off-by: Amir Goldstein <[email protected]>
1 parent fc5a1d2 commit 711747e

File tree

1 file changed

+22
-12
lines changed

1 file changed

+22
-12
lines changed

fs/overlayfs/dir.c

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -553,35 +553,36 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
553553
goto out_dput;
554554
}
555555

556-
static int ovl_setup_cred_for_create(struct dentry *dentry, struct inode *inode,
557-
umode_t mode, const struct cred *old_cred)
556+
static const struct cred *ovl_setup_cred_for_create(struct dentry *dentry,
557+
struct inode *inode,
558+
umode_t mode,
559+
const struct cred *old_cred)
558560
{
559561
int err;
560562
struct cred *override_cred;
561563

562564
override_cred = prepare_creds();
563565
if (!override_cred)
564-
return -ENOMEM;
566+
return ERR_PTR(-ENOMEM);
565567

566568
override_cred->fsuid = inode->i_uid;
567569
override_cred->fsgid = inode->i_gid;
568570
err = security_dentry_create_files_as(dentry, mode, &dentry->d_name,
569571
old_cred, override_cred);
570572
if (err) {
571573
put_cred(override_cred);
572-
return err;
574+
return ERR_PTR(err);
573575
}
574576
put_cred(override_creds(override_cred));
575-
put_cred(override_cred);
576577

577-
return 0;
578+
return override_cred;
578579
}
579580

580581
static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
581582
struct ovl_cattr *attr, bool origin)
582583
{
583584
int err;
584-
const struct cred *old_cred;
585+
const struct cred *old_cred, *new_cred = NULL;
585586
struct dentry *parent = dentry->d_parent;
586587

587588
old_cred = ovl_override_creds(dentry->d_sb);
@@ -610,9 +611,13 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
610611
* create a new inode, so just use the ovl mounter's
611612
* fs{u,g}id.
612613
*/
613-
err = ovl_setup_cred_for_create(dentry, inode, attr->mode, old_cred);
614-
if (err)
614+
new_cred = ovl_setup_cred_for_create(dentry, inode, attr->mode,
615+
old_cred);
616+
err = PTR_ERR(new_cred);
617+
if (IS_ERR(new_cred)) {
618+
new_cred = NULL;
615619
goto out_revert_creds;
620+
}
616621
}
617622

618623
if (!ovl_dentry_is_whiteout(dentry))
@@ -622,6 +627,7 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
622627

623628
out_revert_creds:
624629
ovl_revert_creds(old_cred);
630+
put_cred(new_cred);
625631
return err;
626632
}
627633

@@ -1306,7 +1312,7 @@ static int ovl_rename(struct mnt_idmap *idmap, struct inode *olddir,
13061312
static int ovl_create_tmpfile(struct file *file, struct dentry *dentry,
13071313
struct inode *inode, umode_t mode)
13081314
{
1309-
const struct cred *old_cred;
1315+
const struct cred *old_cred, *new_cred = NULL;
13101316
struct path realparentpath;
13111317
struct file *realfile;
13121318
struct dentry *newdentry;
@@ -1315,9 +1321,12 @@ static int ovl_create_tmpfile(struct file *file, struct dentry *dentry,
13151321
int err;
13161322

13171323
old_cred = ovl_override_creds(dentry->d_sb);
1318-
err = ovl_setup_cred_for_create(dentry, inode, mode, old_cred);
1319-
if (err)
1324+
new_cred = ovl_setup_cred_for_create(dentry, inode, mode, old_cred);
1325+
err = PTR_ERR(new_cred);
1326+
if (IS_ERR(new_cred)) {
1327+
new_cred = NULL;
13201328
goto out_revert_creds;
1329+
}
13211330

13221331
ovl_path_upper(dentry->d_parent, &realparentpath);
13231332
realfile = backing_tmpfile_open(&file->f_path, flags, &realparentpath,
@@ -1338,6 +1347,7 @@ static int ovl_create_tmpfile(struct file *file, struct dentry *dentry,
13381347
}
13391348
out_revert_creds:
13401349
ovl_revert_creds(old_cred);
1350+
put_cred(new_cred);
13411351
return err;
13421352
}
13431353

0 commit comments

Comments
 (0)