diff options
author | Lucas De Marchi <lucas.demarchi@profusion.mobi> | 2012-03-22 22:42:22 +0100 |
---|---|---|
committer | Eric W. Biederman <ebiederm@xmission.com> | 2012-03-22 22:46:56 +0100 |
commit | 4e474a00d7ff746ed177ddae14fa8b2d4bad7a00 (patch) | |
tree | 1255e88406191e4daa29e59ebd37fdc8042184e4 /lib | |
parent | sysctl: Don't call sysctl_follow_link unless we are a link. (diff) | |
download | linux-4e474a00d7ff746ed177ddae14fa8b2d4bad7a00.tar.xz linux-4e474a00d7ff746ed177ddae14fa8b2d4bad7a00.zip |
sysctl: protect poll() in entries that may go away
Protect code accessing ctl_table by grabbing the header with grab_header()
and after releasing with sysctl_head_finish(). This is needed if poll()
is called in entries created by modules: currently only hostname and
domainname support poll(), but this bug may be triggered when/if modules
use it and if user called poll() in a file that doesn't support it.
Dave Jones reported the following when using a syscall fuzzer while
hibernating/resuming:
RIP: 0010:[<ffffffff81233e3e>] [<ffffffff81233e3e>] proc_sys_poll+0x4e/0x90
RAX: 0000000000000145 RBX: ffff88020cab6940 RCX: 0000000000000000
RDX: ffffffff81233df0 RSI: 6b6b6b6b6b6b6b6b RDI: ffff88020cab6940
[ ... ]
Code: 00 48 89 fb 48 89 f1 48 8b 40 30 4c 8b 60 e8 b8 45 01 00 00 49 83
7c 24 28 00 74 2e 49 8b 74 24 30 48 85 f6 74 24 48 85 c9 75 32 <8b> 16
b8 45 01 00 00 48 63 d2 49 39 d5 74 10 8b 06 48 98 48 89
If an entry goes away while we are polling() it, ctl_table may not exist
anymore.
Reported-by: Dave Jones <davej@redhat.com>
Signed-off-by: Lucas De Marchi <lucas.demarchi@profusion.mobi>
Cc: Al Viro <viro@zeniv.linux.org.uk>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Alexey Dobriyan <adobriyan@gmail.com>
Cc: stable@vger.kernel.org
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Diffstat (limited to 'lib')
0 files changed, 0 insertions, 0 deletions