sysfs: fix race between readdir and lseek
authorMing Lei <ming.lei@canonical.com>
Wed, 20 Mar 2013 15:25:24 +0000 (23:25 +0800)
committerBen Hutchings <ben@decadent.org.uk>
Wed, 10 Apr 2013 02:20:00 +0000 (03:20 +0100)
commit76bfc5ab57137d351a9046a002ee39a220d0e012
tree517bde19947052216124976b423090e2347afc78
parent2c22dbb8ad3e320dfd1d98ba687b4966bcb65502
sysfs: fix race between readdir and lseek

commit 991f76f837bf22c5bb07261cfd86525a0a96650c upstream.

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.

Reported-by: Dave Jones <davej@redhat.com>
Tested-by: Sasha Levin <levinsasha928@gmail.com>
Signed-off-by: Ming Lei <ming.lei@canonical.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
[bwh: Backported to 3.2: open-code file_inode() which we don't have]
Signed-off-by: Ben Hutchings <ben@decadent.org.uk>
fs/sysfs/dir.c