diff options
| author | Jeff Mahoney <jeffm@suse.com> | 2016-07-05 17:32:29 -0400 |
|---|---|---|
| committer | Tyler Hicks <tyhicks@canonical.com> | 2016-07-07 19:47:57 -0400 |
| commit | 78c4e172412de5d0456dc00d2b34050aa0b683b5 (patch) | |
| tree | 38bb67536788cf18997559d2d067c2459192ce63 /fs/ecryptfs | |
| parent | 40f0fd372a623e8d32bae0b9361d2a7453ae7a2e (diff) | |
Revert "ecryptfs: forbid opening files without mmap handler"
This reverts commit 2f36db71009304b3f0b95afacd8eba1f9f046b87.
It fixed a local root exploit but also introduced a dependency on
the lower file system implementing an mmap operation just to open a file,
which is a bit of a heavy hammer. The right fix is to have mmap depend
on the existence of the mmap handler instead.
Signed-off-by: Jeff Mahoney <jeffm@suse.com>
Cc: stable@vger.kernel.org
Signed-off-by: Tyler Hicks <tyhicks@canonical.com>
Diffstat (limited to 'fs/ecryptfs')
| -rw-r--r-- | fs/ecryptfs/kthread.c | 13 |
1 files changed, 2 insertions, 11 deletions
diff --git a/fs/ecryptfs/kthread.c b/fs/ecryptfs/kthread.c index e818f5ac7a26..866bb18efefe 100644 --- a/fs/ecryptfs/kthread.c +++ b/fs/ecryptfs/kthread.c | |||
| @@ -25,7 +25,6 @@ | |||
| 25 | #include <linux/slab.h> | 25 | #include <linux/slab.h> |
| 26 | #include <linux/wait.h> | 26 | #include <linux/wait.h> |
| 27 | #include <linux/mount.h> | 27 | #include <linux/mount.h> |
| 28 | #include <linux/file.h> | ||
| 29 | #include "ecryptfs_kernel.h" | 28 | #include "ecryptfs_kernel.h" |
| 30 | 29 | ||
| 31 | struct ecryptfs_open_req { | 30 | struct ecryptfs_open_req { |
| @@ -148,7 +147,7 @@ int ecryptfs_privileged_open(struct file **lower_file, | |||
| 148 | flags |= IS_RDONLY(d_inode(lower_dentry)) ? O_RDONLY : O_RDWR; | 147 | flags |= IS_RDONLY(d_inode(lower_dentry)) ? O_RDONLY : O_RDWR; |
| 149 | (*lower_file) = dentry_open(&req.path, flags, cred); | 148 | (*lower_file) = dentry_open(&req.path, flags, cred); |
| 150 | if (!IS_ERR(*lower_file)) | 149 | if (!IS_ERR(*lower_file)) |
| 151 | goto have_file; | 150 | goto out; |
| 152 | if ((flags & O_ACCMODE) == O_RDONLY) { | 151 | if ((flags & O_ACCMODE) == O_RDONLY) { |
| 153 | rc = PTR_ERR((*lower_file)); | 152 | rc = PTR_ERR((*lower_file)); |
| 154 | goto out; | 153 | goto out; |
| @@ -166,16 +165,8 @@ int ecryptfs_privileged_open(struct file **lower_file, | |||
| 166 | mutex_unlock(&ecryptfs_kthread_ctl.mux); | 165 | mutex_unlock(&ecryptfs_kthread_ctl.mux); |
| 167 | wake_up(&ecryptfs_kthread_ctl.wait); | 166 | wake_up(&ecryptfs_kthread_ctl.wait); |
| 168 | wait_for_completion(&req.done); | 167 | wait_for_completion(&req.done); |
| 169 | if (IS_ERR(*lower_file)) { | 168 | if (IS_ERR(*lower_file)) |
| 170 | rc = PTR_ERR(*lower_file); | 169 | rc = PTR_ERR(*lower_file); |
| 171 | goto out; | ||
| 172 | } | ||
| 173 | have_file: | ||
| 174 | if ((*lower_file)->f_op->mmap == NULL) { | ||
| 175 | fput(*lower_file); | ||
| 176 | *lower_file = NULL; | ||
| 177 | rc = -EMEDIUMTYPE; | ||
| 178 | } | ||
| 179 | out: | 170 | out: |
| 180 | return rc; | 171 | return rc; |
| 181 | } | 172 | } |
