forked from luck/tmp_suning_uos_patched
ecryptfs_rename(): verify that lower dentries are still OK after lock_rename()
We get lower layer dentries, find their parents, do lock_rename() and proceed to vfs_rename(). However, we do not check that dentries still have the same parents and are not unlinked. Need to check that... Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
parent
b07581d2d5
commit
74dd7c97ea
|
@ -593,11 +593,16 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry,
|
||||||
lower_new_dir_dentry = dget_parent(lower_new_dentry);
|
lower_new_dir_dentry = dget_parent(lower_new_dentry);
|
||||||
target_inode = d_inode(new_dentry);
|
target_inode = d_inode(new_dentry);
|
||||||
trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
|
trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry);
|
||||||
/* source should not be ancestor of target */
|
rc = -EINVAL;
|
||||||
if (trap == lower_old_dentry) {
|
if (lower_old_dentry->d_parent != lower_old_dir_dentry)
|
||||||
rc = -EINVAL;
|
goto out_lock;
|
||||||
|
if (lower_new_dentry->d_parent != lower_new_dir_dentry)
|
||||||
|
goto out_lock;
|
||||||
|
if (d_unhashed(lower_old_dentry) || d_unhashed(lower_new_dentry))
|
||||||
|
goto out_lock;
|
||||||
|
/* source should not be ancestor of target */
|
||||||
|
if (trap == lower_old_dentry)
|
||||||
goto out_lock;
|
goto out_lock;
|
||||||
}
|
|
||||||
/* target should not be ancestor of source */
|
/* target should not be ancestor of source */
|
||||||
if (trap == lower_new_dentry) {
|
if (trap == lower_new_dentry) {
|
||||||
rc = -ENOTEMPTY;
|
rc = -ENOTEMPTY;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user