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