patch "sysfs: fix race between readdir and lseek" added to driver-core tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
sysfs: fix race between readdir and lseek
to my driver-core git tree which can be found at
git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/driver-core.git
in the driver-core-linus branch.
The patch will show up in the next release of the linux-next tree (usually sometime within the next 24 hours during the week.)
The patch will hopefully also be merged in Linus's tree for the next -rc kernel release.
If you have any questions about this process, please let me know.
Quoted 1 line
From
991f76f837bf22c5bb07261cfd86525a0a96650cMon Sep 17 00:00:00 2001
From: Ming Lei <[email protected]>
Date: Wed, 20 Mar 2013 23:25:24 +0800
Subject: sysfs: fix race between readdir and lseek
While readdir() is running, lseek() may set filp->f_pos as zero, then may leave filp->private_data pointing to one sysfs_dirent object without holding its reference counter, so the sysfs_dirent object may be used after free in next readdir().
This patch holds inode->i_mutex to avoid the problem since the lock is always held in readdir path.
--- fs/sysfs/dir.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-)
fs/sysfs/dir.c +12 -1
@@ -1058,10 +1058,21 @@ static int sysfs_readdir(struct file * filp, void * dirent, filldir_t filldir)return 0 ; } +static loff_t sysfs_dir_llseek (struct file *file,loff_t offset,int whence) +{ +struct inode *inode =file_inode (file); +loff_t ret; + +mutex_lock (&inode->i_mutex); + ret =generic_file_llseek (file, offset, whence); +mutex_unlock (&inode->i_mutex); + +return ret; +}const struct file_operations sysfs_dir_operations = { .read = generic_read_dir, .readdir = sysfs_readdir, .release = sysfs_dir_release, - .llseek = generic_file_llseek, + .llseek = sysfs_dir_llseek, };
Signature · 1 line
1.8.0.rc0.18.gf84667d