diff options
Diffstat (limited to 'fs/ecryptfs/file.c')
-rw-r--r-- | fs/ecryptfs/file.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/fs/ecryptfs/file.c b/fs/ecryptfs/file.c index 9e944057001b..e7440a6f5ebf 100644 --- a/fs/ecryptfs/file.c +++ b/fs/ecryptfs/file.c | |||
@@ -25,6 +25,7 @@ | |||
25 | 25 | ||
26 | #include <linux/file.h> | 26 | #include <linux/file.h> |
27 | #include <linux/poll.h> | 27 | #include <linux/poll.h> |
28 | #include <linux/slab.h> | ||
28 | #include <linux/mount.h> | 29 | #include <linux/mount.h> |
29 | #include <linux/pagemap.h> | 30 | #include <linux/pagemap.h> |
30 | #include <linux/security.h> | 31 | #include <linux/security.h> |
@@ -158,7 +159,7 @@ static int ecryptfs_open(struct inode *inode, struct file *file) | |||
158 | struct dentry *ecryptfs_dentry = file->f_path.dentry; | 159 | struct dentry *ecryptfs_dentry = file->f_path.dentry; |
159 | /* Private value of ecryptfs_dentry allocated in | 160 | /* Private value of ecryptfs_dentry allocated in |
160 | * ecryptfs_lookup() */ | 161 | * ecryptfs_lookup() */ |
161 | struct dentry *lower_dentry = ecryptfs_dentry_to_lower(ecryptfs_dentry); | 162 | struct dentry *lower_dentry; |
162 | struct ecryptfs_file_info *file_info; | 163 | struct ecryptfs_file_info *file_info; |
163 | 164 | ||
164 | mount_crypt_stat = &ecryptfs_superblock_to_private( | 165 | mount_crypt_stat = &ecryptfs_superblock_to_private( |
@@ -191,13 +192,6 @@ static int ecryptfs_open(struct inode *inode, struct file *file) | |||
191 | | ECRYPTFS_ENCRYPTED); | 192 | | ECRYPTFS_ENCRYPTED); |
192 | } | 193 | } |
193 | mutex_unlock(&crypt_stat->cs_mutex); | 194 | mutex_unlock(&crypt_stat->cs_mutex); |
194 | if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_RDONLY) | ||
195 | && !(file->f_flags & O_RDONLY)) { | ||
196 | rc = -EPERM; | ||
197 | printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs " | ||
198 | "file must hence be opened RO\n", __func__); | ||
199 | goto out; | ||
200 | } | ||
201 | if (!ecryptfs_inode_to_private(inode)->lower_file) { | 195 | if (!ecryptfs_inode_to_private(inode)->lower_file) { |
202 | rc = ecryptfs_init_persistent_file(ecryptfs_dentry); | 196 | rc = ecryptfs_init_persistent_file(ecryptfs_dentry); |
203 | if (rc) { | 197 | if (rc) { |
@@ -208,6 +202,13 @@ static int ecryptfs_open(struct inode *inode, struct file *file) | |||
208 | goto out; | 202 | goto out; |
209 | } | 203 | } |
210 | } | 204 | } |
205 | if ((ecryptfs_inode_to_private(inode)->lower_file->f_flags & O_RDONLY) | ||
206 | && !(file->f_flags & O_RDONLY)) { | ||
207 | rc = -EPERM; | ||
208 | printk(KERN_WARNING "%s: Lower persistent file is RO; eCryptfs " | ||
209 | "file must hence be opened RO\n", __func__); | ||
210 | goto out; | ||
211 | } | ||
211 | ecryptfs_set_file_lower( | 212 | ecryptfs_set_file_lower( |
212 | file, ecryptfs_inode_to_private(inode)->lower_file); | 213 | file, ecryptfs_inode_to_private(inode)->lower_file); |
213 | if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) { | 214 | if (S_ISDIR(ecryptfs_dentry->d_inode->i_mode)) { |
@@ -299,7 +300,6 @@ static int ecryptfs_ioctl(struct inode *inode, struct file *file, | |||
299 | const struct file_operations ecryptfs_dir_fops = { | 300 | const struct file_operations ecryptfs_dir_fops = { |
300 | .readdir = ecryptfs_readdir, | 301 | .readdir = ecryptfs_readdir, |
301 | .ioctl = ecryptfs_ioctl, | 302 | .ioctl = ecryptfs_ioctl, |
302 | .mmap = generic_file_mmap, | ||
303 | .open = ecryptfs_open, | 303 | .open = ecryptfs_open, |
304 | .flush = ecryptfs_flush, | 304 | .flush = ecryptfs_flush, |
305 | .release = ecryptfs_release, | 305 | .release = ecryptfs_release, |