Browse Source

Merge branch 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs

Pull vfs fixes from Al Viro.

* 'fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/viro/vfs:
  gfs2_meta: ->mount() can get NULL dev_name
  ecryptfs_rename(): verify that lower dentries are still OK after lock_rename()
  cachefiles: fix the race between cachefiles_bury_object() and rmdir(2)
Linus Torvalds 6 years ago
parent
commit
6b609e3b00
2 changed files with 11 additions and 3 deletions
  1. 8 3
      fs/ecryptfs/inode.c
  2. 3 0
      fs/gfs2/ops_fstype.c

+ 8 - 3
fs/ecryptfs/inode.c

@@ -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);
+	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 */
 	/* source should not be ancestor of target */
-	if (trap == lower_old_dentry) {
-		rc = -EINVAL;
+	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;

+ 3 - 0
fs/gfs2/ops_fstype.c

@@ -1333,6 +1333,9 @@ static struct dentry *gfs2_mount_meta(struct file_system_type *fs_type,
 	struct path path;
 	struct path path;
 	int error;
 	int error;
 
 
+	if (!dev_name || !*dev_name)
+		return ERR_PTR(-EINVAL);
+
 	error = kern_path(dev_name, LOOKUP_FOLLOW, &path);
 	error = kern_path(dev_name, LOOKUP_FOLLOW, &path);
 	if (error) {
 	if (error) {
 		pr_warn("path_lookup on %s returned error %d\n",
 		pr_warn("path_lookup on %s returned error %d\n",