@@ -553,35 +553,36 @@ static int ovl_create_over_whiteout(struct dentry *dentry, struct inode *inode,
553
553
goto out_dput ;
554
554
}
555
555
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 )
558
560
{
559
561
int err ;
560
562
struct cred * override_cred ;
561
563
562
564
override_cred = prepare_creds ();
563
565
if (!override_cred )
564
- return - ENOMEM ;
566
+ return ERR_PTR ( - ENOMEM ) ;
565
567
566
568
override_cred -> fsuid = inode -> i_uid ;
567
569
override_cred -> fsgid = inode -> i_gid ;
568
570
err = security_dentry_create_files_as (dentry , mode , & dentry -> d_name ,
569
571
old_cred , override_cred );
570
572
if (err ) {
571
573
put_cred (override_cred );
572
- return err ;
574
+ return ERR_PTR ( err ) ;
573
575
}
574
576
put_cred (override_creds (override_cred ));
575
- put_cred (override_cred );
576
577
577
- return 0 ;
578
+ return override_cred ;
578
579
}
579
580
580
581
static int ovl_create_or_link (struct dentry * dentry , struct inode * inode ,
581
582
struct ovl_cattr * attr , bool origin )
582
583
{
583
584
int err ;
584
- const struct cred * old_cred ;
585
+ const struct cred * old_cred , * new_cred = NULL ;
585
586
struct dentry * parent = dentry -> d_parent ;
586
587
587
588
old_cred = ovl_override_creds (dentry -> d_sb );
@@ -610,9 +611,13 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
610
611
* create a new inode, so just use the ovl mounter's
611
612
* fs{u,g}id.
612
613
*/
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 ;
615
619
goto out_revert_creds ;
620
+ }
616
621
}
617
622
618
623
if (!ovl_dentry_is_whiteout (dentry ))
@@ -622,6 +627,7 @@ static int ovl_create_or_link(struct dentry *dentry, struct inode *inode,
622
627
623
628
out_revert_creds :
624
629
ovl_revert_creds (old_cred );
630
+ put_cred (new_cred );
625
631
return err ;
626
632
}
627
633
@@ -1306,7 +1312,7 @@ static int ovl_rename(struct mnt_idmap *idmap, struct inode *olddir,
1306
1312
static int ovl_create_tmpfile (struct file * file , struct dentry * dentry ,
1307
1313
struct inode * inode , umode_t mode )
1308
1314
{
1309
- const struct cred * old_cred ;
1315
+ const struct cred * old_cred , * new_cred = NULL ;
1310
1316
struct path realparentpath ;
1311
1317
struct file * realfile ;
1312
1318
struct dentry * newdentry ;
@@ -1315,9 +1321,12 @@ static int ovl_create_tmpfile(struct file *file, struct dentry *dentry,
1315
1321
int err ;
1316
1322
1317
1323
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 ;
1320
1328
goto out_revert_creds ;
1329
+ }
1321
1330
1322
1331
ovl_path_upper (dentry -> d_parent , & realparentpath );
1323
1332
realfile = backing_tmpfile_open (& file -> f_path , flags , & realparentpath ,
@@ -1338,6 +1347,7 @@ static int ovl_create_tmpfile(struct file *file, struct dentry *dentry,
1338
1347
}
1339
1348
out_revert_creds :
1340
1349
ovl_revert_creds (old_cred );
1350
+ put_cred (new_cred );
1341
1351
return err ;
1342
1352
}
1343
1353
0 commit comments