]> git.ipfire.org Git - people/ms/linux.git/commit
fix misuses of f_count() in ppp and netlink
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 9 Oct 2014 03:44:00 +0000 (23:44 -0400)
committerWilly Tarreau <w@1wt.eu>
Sun, 23 Nov 2014 09:55:46 +0000 (10:55 +0100)
commit3a0ed0e3c95280c6e4f247f1337560d520830ee4
tree90d8f44a30742bcecb9bc0c68f5151f388a23782
parentfaa4cc13e7acb2d1f313290b556d5b7401cc65c8
fix misuses of f_count() in ppp and netlink

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.

Cc: stable@vger.kernel.org
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
(cherry picked from commit 24dff96a37a2ca319e75a74d3929b2de22447ca6)
[wt: apply to drivers/net/ppp_generic.c only]
Signed-off-by: Willy Tarreau <w@1wt.eu>
drivers/net/ppp_generic.c