|
@@ -405,28 +405,13 @@ static int ovl_create_or_link(struct dentry *dentry, int mode, dev_t rdev,
|
|
|
err = ovl_create_upper(dentry, inode, &stat, link, hardlink);
|
|
|
} else {
|
|
|
const struct cred *old_cred;
|
|
|
- struct cred *override_cred;
|
|
|
|
|
|
- err = -ENOMEM;
|
|
|
- override_cred = prepare_creds();
|
|
|
- if (!override_cred)
|
|
|
- goto out_iput;
|
|
|
-
|
|
|
- /*
|
|
|
- * CAP_SYS_ADMIN for setting opaque xattr
|
|
|
- * CAP_DAC_OVERRIDE for create in workdir, rename
|
|
|
- * CAP_FOWNER for removing whiteout from sticky dir
|
|
|
- */
|
|
|
- cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_FOWNER);
|
|
|
- old_cred = override_creds(override_cred);
|
|
|
+ old_cred = ovl_override_creds(dentry->d_sb);
|
|
|
|
|
|
err = ovl_create_over_whiteout(dentry, inode, &stat, link,
|
|
|
hardlink);
|
|
|
|
|
|
revert_creds(old_cred);
|
|
|
- put_cred(override_cred);
|
|
|
}
|
|
|
|
|
|
if (!err)
|
|
@@ -662,32 +647,11 @@ static int ovl_do_remove(struct dentry *dentry, bool is_dir)
|
|
|
if (OVL_TYPE_PURE_UPPER(type)) {
|
|
|
err = ovl_remove_upper(dentry, is_dir);
|
|
|
} else {
|
|
|
- const struct cred *old_cred;
|
|
|
- struct cred *override_cred;
|
|
|
-
|
|
|
- err = -ENOMEM;
|
|
|
- override_cred = prepare_creds();
|
|
|
- if (!override_cred)
|
|
|
- goto out_drop_write;
|
|
|
-
|
|
|
- /*
|
|
|
- * CAP_SYS_ADMIN for setting xattr on whiteout, opaque dir
|
|
|
- * CAP_DAC_OVERRIDE for create in workdir, rename
|
|
|
- * CAP_FOWNER for removing whiteout from sticky dir
|
|
|
- * CAP_FSETID for chmod of opaque dir
|
|
|
- * CAP_CHOWN for chown of opaque dir
|
|
|
- */
|
|
|
- cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_FOWNER);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_FSETID);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_CHOWN);
|
|
|
- old_cred = override_creds(override_cred);
|
|
|
+ const struct cred *old_cred = ovl_override_creds(dentry->d_sb);
|
|
|
|
|
|
err = ovl_remove_and_whiteout(dentry, is_dir);
|
|
|
|
|
|
revert_creds(old_cred);
|
|
|
- put_cred(override_cred);
|
|
|
}
|
|
|
out_drop_write:
|
|
|
ovl_drop_write(dentry);
|
|
@@ -725,7 +689,6 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old,
|
|
|
bool new_is_dir = false;
|
|
|
struct dentry *opaquedir = NULL;
|
|
|
const struct cred *old_cred = NULL;
|
|
|
- struct cred *override_cred = NULL;
|
|
|
|
|
|
err = -EINVAL;
|
|
|
if (flags & ~(RENAME_EXCHANGE | RENAME_NOREPLACE))
|
|
@@ -794,26 +757,8 @@ static int ovl_rename2(struct inode *olddir, struct dentry *old,
|
|
|
old_opaque = !OVL_TYPE_PURE_UPPER(old_type);
|
|
|
new_opaque = !OVL_TYPE_PURE_UPPER(new_type);
|
|
|
|
|
|
- if (old_opaque || new_opaque) {
|
|
|
- err = -ENOMEM;
|
|
|
- override_cred = prepare_creds();
|
|
|
- if (!override_cred)
|
|
|
- goto out_drop_write;
|
|
|
-
|
|
|
- /*
|
|
|
- * CAP_SYS_ADMIN for setting xattr on whiteout, opaque dir
|
|
|
- * CAP_DAC_OVERRIDE for create in workdir
|
|
|
- * CAP_FOWNER for removing whiteout from sticky dir
|
|
|
- * CAP_FSETID for chmod of opaque dir
|
|
|
- * CAP_CHOWN for chown of opaque dir
|
|
|
- */
|
|
|
- cap_raise(override_cred->cap_effective, CAP_SYS_ADMIN);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_DAC_OVERRIDE);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_FOWNER);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_FSETID);
|
|
|
- cap_raise(override_cred->cap_effective, CAP_CHOWN);
|
|
|
- old_cred = override_creds(override_cred);
|
|
|
- }
|
|
|
+ if (old_opaque || new_opaque)
|
|
|
+ old_cred = ovl_override_creds(old->d_sb);
|
|
|
|
|
|
if (overwrite && OVL_TYPE_MERGE_OR_LOWER(new_type) && new_is_dir) {
|
|
|
opaquedir = ovl_check_empty_and_clear(new);
|
|
@@ -943,10 +888,8 @@ out_dput_old:
|
|
|
out_unlock:
|
|
|
unlock_rename(new_upperdir, old_upperdir);
|
|
|
out_revert_creds:
|
|
|
- if (old_opaque || new_opaque) {
|
|
|
+ if (old_opaque || new_opaque)
|
|
|
revert_creds(old_cred);
|
|
|
- put_cred(override_cred);
|
|
|
- }
|
|
|
out_drop_write:
|
|
|
ovl_drop_write(old);
|
|
|
out:
|