Patch "[PATCH 113/135] ecryptfs: fix handling of directory opening" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
[PATCH 113/135] ecryptfs: fix handling of directory opening
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
0113-ecryptfs-fix-handling-of-directory-opening.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From
c8e2078306d9e7d3784fffaf1189b0a623a6afa5Mon Sep 17 00:00:00 2001
From: Al Viro <[email protected]>
Date: Wed, 8 Jun 2016 19:20:33 +0100
Subject: [PATCH 113/135] ecryptfs: fix handling of directory opening
[ Upstream commit 6a480a7842545ec520a91730209ec0bae41694c1 ]
First of all, trying to open them r/w is idiocy; it's guaranteed to fail. Moreover, assigning ->f_pos and assuming that everything will work is blatantly broken - try that with e.g. tmpfs as underlying layer and watch the fireworks. There may be a non-trivial amount of state associated with current IO position, well beyond the numeric offset. Using the single struct file associated with underlying inode is really not a good idea; we ought to open one for each ecryptfs directory struct file.
Additionally, file_operations both for directories and non-directories are full of pointless methods; non-directories should *not* have ->iterate(), directories should not have ->flush(), ->fasync() and ->splice_read().
--- fs/ecryptfs/file.c | 71 +++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 55 insertions(+), 16 deletions(-)
fs/ecryptfs/file.c +55 -16
@@ -112,7 +112,6 @@ static int ecryptfs_readdir(struct file .sb = inode->i_sb, }; lower_file =ecryptfs_file_to_lower (file); - lower_file->f_pos = ctx->pos; rc =iterate_dir (lower_file, &buf.ctx); ctx->pos = buf.ctx.pos;if (rc <0 )
@@ -236,14 +235,6 @@ static int ecryptfs_open(struct inode *i }ecryptfs_set_file_lower ( file,ecryptfs_inode_to_private (inode)->lower_file); -if (d_is_dir (ecryptfs_dentry)) { -ecryptfs_printk (KERN_DEBUG ,"This is a directory\n" ); -mutex_lock (&crypt_stat->cs_mutex); - crypt_stat->flags &= ~(ECRYPTFS_ENCRYPTED ); -mutex_unlock (&crypt_stat->cs_mutex); - rc =0 ; - goto out; - } rc =read_or_initialize_metadata (ecryptfs_dentry);if (rc) goto out_put;
@@ -260,6 +251,45 @@ out:return rc; } +/** +* ecryptfs_dir_open +* @inode: inode speciying file to open +* @file: Structure to return filled in +* +* Opens the file specified by inode. +* +* Returns zero on success; non-zero otherwise +*/ +static int ecryptfs_dir_open (struct inode *inode,struct file *file) +{ +struct dentry *ecryptfs_dentry = file->f_path.dentry; +/* Private value of ecryptfs_dentry allocated in +* ecryptfs_lookup() */ +struct ecryptfs_file_info *file_info; +struct file *lower_file; + +/* Released in ecryptfs_release or end of function if failure */ + file_info =kmem_cache_zalloc (ecryptfs_file_info_cache,GFP_KERNEL ); +ecryptfs_set_file_private (file, file_info); +if (unlikely (!file_info)) { +ecryptfs_printk (KERN_ERR , +"Error attempting to allocate memory\n" ); +return -ENOMEM ; + } + lower_file =dentry_open (ecryptfs_dentry_to_lower_path (ecryptfs_dentry), + file->f_flags,current_cred ()); +if (IS_ERR (lower_file)) { +printk (KERN_ERR "%s: Error attempting to initialize " +"the lower file for the dentry with name " +"[%pd]; rc = [%ld]\n" , __func__, + ecryptfs_dentry,PTR_ERR (lower_file)); +kmem_cache_free (ecryptfs_file_info_cache, file_info); +return PTR_ERR (lower_file); + } +ecryptfs_set_file_lower (file, lower_file); +return 0 ; +} +static int ecryptfs_flush (struct file *file,fl_owner_t td) {struct file *lower_file =ecryptfs_file_to_lower (file);
@@ -280,6 +310,19 @@ static int ecryptfs_release(struct inodereturn 0 ; } +static int ecryptfs_dir_release (struct inode *inode,struct file *file) +{ +fput (ecryptfs_file_to_lower (file)); +kmem_cache_free (ecryptfs_file_info_cache, +ecryptfs_file_to_private (file)); +return 0 ; +} + +static loff_t ecryptfs_dir_llseek (struct file *file,loff_t offset,int whence) +{ +return vfs_llseek (ecryptfs_file_to_lower (file), offset, whence); +} +static int ecryptfs_fsync (struct file *file,loff_t start,loff_t end,int datasync) {
@@ -359,20 +402,16 @@ const struct file_operations ecryptfs_di#ifdef CONFIG_COMPAT .compat_ioctl = ecryptfs_compat_ioctl, #endif - .open = ecryptfs_open, - .flush = ecryptfs_flush, - .release = ecryptfs_release, + .open = ecryptfs_dir_open, + .release = ecryptfs_dir_release, .fsync = ecryptfs_fsync, - .fasync = ecryptfs_fasync, - .splice_read = generic_file_splice_read, - .llseek = default_llseek, + .llseek = ecryptfs_dir_llseek, };const struct file_operations ecryptfs_main_fops = { .llseek = generic_file_llseek, .read_iter = ecryptfs_read_update_atime, .write_iter = generic_file_write_iter, - .iterate = ecryptfs_readdir, .unlocked_ioctl = ecryptfs_unlocked_ioctl, #ifdef CONFIG_COMPAT .compat_ioctl = ecryptfs_compat_ioctl,
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/0113-ecryptfs-fix-handling-of-directory-opening.patch