Commit 74dd7c97 authored by Al Viro's avatar Al Viro
Browse files

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: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent b07581d2
Loading
Loading
Loading
Loading
+8 −3
Original line number Original line Diff line number Diff line
@@ -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 */
	if (trap == lower_old_dentry) {
	rc = -EINVAL;
	rc = -EINVAL;
	if (lower_old_dentry->d_parent != lower_old_dir_dentry)
		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;