diff options
Diffstat (limited to 'fs')
| -rw-r--r-- | fs/ecryptfs/inode.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/fs/ecryptfs/inode.c b/fs/ecryptfs/inode.c index 5726d7adaf5b..764dc777b268 100644 --- a/fs/ecryptfs/inode.c +++ b/fs/ecryptfs/inode.c | |||
| @@ -614,6 +614,7 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 614 | struct dentry *lower_new_dentry; | 614 | struct dentry *lower_new_dentry; |
| 615 | struct dentry *lower_old_dir_dentry; | 615 | struct dentry *lower_old_dir_dentry; |
| 616 | struct dentry *lower_new_dir_dentry; | 616 | struct dentry *lower_new_dir_dentry; |
| 617 | struct dentry *trap = NULL; | ||
| 617 | 618 | ||
| 618 | lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry); | 619 | lower_old_dentry = ecryptfs_dentry_to_lower(old_dentry); |
| 619 | lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry); | 620 | lower_new_dentry = ecryptfs_dentry_to_lower(new_dentry); |
| @@ -621,7 +622,17 @@ ecryptfs_rename(struct inode *old_dir, struct dentry *old_dentry, | |||
| 621 | dget(lower_new_dentry); | 622 | dget(lower_new_dentry); |
| 622 | lower_old_dir_dentry = dget_parent(lower_old_dentry); | 623 | lower_old_dir_dentry = dget_parent(lower_old_dentry); |
| 623 | lower_new_dir_dentry = dget_parent(lower_new_dentry); | 624 | lower_new_dir_dentry = dget_parent(lower_new_dentry); |
| 624 | lock_rename(lower_old_dir_dentry, lower_new_dir_dentry); | 625 | trap = lock_rename(lower_old_dir_dentry, lower_new_dir_dentry); |
| 626 | /* source should not be ancestor of target */ | ||
| 627 | if (trap == lower_old_dentry) { | ||
| 628 | rc = -EINVAL; | ||
| 629 | goto out_lock; | ||
| 630 | } | ||
| 631 | /* target should not be ancestor of source */ | ||
| 632 | if (trap == lower_new_dentry) { | ||
| 633 | rc = -ENOTEMPTY; | ||
| 634 | goto out_lock; | ||
| 635 | } | ||
| 625 | rc = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry, | 636 | rc = vfs_rename(lower_old_dir_dentry->d_inode, lower_old_dentry, |
| 626 | lower_new_dir_dentry->d_inode, lower_new_dentry); | 637 | lower_new_dir_dentry->d_inode, lower_new_dentry); |
| 627 | if (rc) | 638 | if (rc) |
