]> git.baikalelectronics.ru Git - kernel.git/commit
net: fix sock_wake_async() rcu protection
authorEric Dumazet <edumazet@google.com>
Mon, 30 Nov 2015 04:03:11 +0000 (20:03 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 1 Dec 2015 20:45:05 +0000 (15:45 -0500)
commit8e44a446265159a9d10a5a433625764e3c6c0b2e
tree4d12375d4193b130ec15daac9acea099b7083544
parent2266c0aea1defc987b207f84f50e7db270a8cb48
net: fix sock_wake_async() rcu protection

Dmitry provided a syzkaller (http://github.com/google/syzkaller)
triggering a fault in sock_wake_async() when async IO is requested.

Said program stressed af_unix sockets, but the issue is generic
and should be addressed in core networking stack.

The problem is that by the time sock_wake_async() is called,
we should not access the @flags field of 'struct socket',
as the inode containing this socket might be freed without
further notice, and without RCU grace period.

We already maintain an RCU protected structure, "struct socket_wq"
so moving SOCKWQ_ASYNC_NOSPACE & SOCKWQ_ASYNC_WAITDATA into it
is the safe route.

It also reduces number of cache lines needing dirtying, so might
provide a performance improvement anyway.

In followup patches, we might move remaining flags (SOCK_NOSPACE,
SOCK_PASSCRED, SOCK_PASSSEC) to save 8 bytes and let 'struct socket'
being mostly read and let it being shared between cpus.

Reported-by: Dmitry Vyukov <dvyukov@google.com>
Signed-off-by: Eric Dumazet <edumazet@google.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
include/linux/net.h
include/net/sock.h
net/core/stream.c
net/sctp/socket.c
net/socket.c