vfs: add cross-rename
[firefly-linux-kernel-4.4.55.git] / security / security.c
index 284fbc99aa9d319fe05e40fcffeb7d22e89a0eb3..8b774f362a3d4ed252f626c8e6de5634a5820148 100644 (file)
@@ -439,6 +439,14 @@ int security_path_rename(struct path *old_dir, struct dentry *old_dentry,
        if (unlikely(IS_PRIVATE(old_dentry->d_inode) ||
                     (new_dentry->d_inode && IS_PRIVATE(new_dentry->d_inode))))
                return 0;
+
+       if (flags & RENAME_EXCHANGE) {
+               int err = security_ops->path_rename(new_dir, new_dentry,
+                                                   old_dir, old_dentry);
+               if (err)
+                       return err;
+       }
+
        return security_ops->path_rename(old_dir, old_dentry, new_dir,
                                         new_dentry);
 }
@@ -531,6 +539,14 @@ int security_inode_rename(struct inode *old_dir, struct dentry *old_dentry,
         if (unlikely(IS_PRIVATE(old_dentry->d_inode) ||
             (new_dentry->d_inode && IS_PRIVATE(new_dentry->d_inode))))
                return 0;
+
+       if (flags & RENAME_EXCHANGE) {
+               int err = security_ops->inode_rename(new_dir, new_dentry,
+                                                    old_dir, old_dentry);
+               if (err)
+                       return err;
+       }
+
        return security_ops->inode_rename(old_dir, old_dentry,
                                           new_dir, new_dentry);
 }