diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2014-10-08 23:44:00 -0400 |
---|---|---|
committer | Luis Henriques <luis.henriques@canonical.com> | 2014-11-14 15:20:10 +0000 |
commit | a0649e6d56ff026292a1d6da0853c81b2ca8536c (patch) | |
tree | 242aba11a94503df81b21798488b321829d94c65 /net | |
parent | e61cf85b390142e79b68686466820adfad47b77f (diff) | |
download | linux-stable-a0649e6d56ff026292a1d6da0853c81b2ca8536c.tar.gz linux-stable-a0649e6d56ff026292a1d6da0853c81b2ca8536c.tar.bz2 linux-stable-a0649e6d56ff026292a1d6da0853c81b2ca8536c.zip |
fix misuses of f_count() in ppp and netlink
commit 24dff96a37a2ca319e75a74d3929b2de22447ca6 upstream.
we used to check for "nobody else could start doing anything with
that opened file" by checking that refcount was 2 or less - one
for descriptor table and one we'd acquired in fget() on the way to
wherever we are. That was race-prone (somebody else might have
had a reference to descriptor table and do fget() just as we'd
been checking) and it had become flat-out incorrect back when
we switched to fget_light() on those codepaths - unlike fget(),
it doesn't grab an extra reference unless the descriptor table
is shared. The same change allowed a race-free check, though -
we are safe exactly when refcount is less than 2.
It was a long time ago; pre-2.6.12 for ioctl() (the codepath leading
to ppp one) and 2.6.17 for sendmsg() (netlink one). OTOH,
netlink hadn't grown that check until 3.9 and ppp used to live
in drivers/net, not drivers/net/ppp until 3.1. The bug existed
well before that, though, and the same fix used to apply in old
location of file.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
Diffstat (limited to 'net')
-rw-r--r-- | net/netlink/af_netlink.c | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/net/netlink/af_netlink.c b/net/netlink/af_netlink.c index 48fc607a211e..d158e1c888d8 100644 --- a/net/netlink/af_netlink.c +++ b/net/netlink/af_netlink.c @@ -707,7 +707,7 @@ static int netlink_mmap_sendmsg(struct sock *sk, struct msghdr *msg, * after validation, the socket and the ring may only be used by a * single process, otherwise we fall back to copying. */ - if (atomic_long_read(&sk->sk_socket->file->f_count) > 2 || + if (atomic_long_read(&sk->sk_socket->file->f_count) > 1 || atomic_read(&nlk->mapped) > 1) excl = false; |