@@ -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
580581static 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
623628out_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,
13061312static 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 }
13391348out_revert_creds :
13401349 ovl_revert_creds (old_cred );
1350+ put_cred (new_cred );
13411351 return err ;
13421352}
13431353
0 commit comments