packet: in packet_do_bind, test fanout with bind_lock held
Subsystems (3)
Willem de Bruijn
maintainerPATCH 1/1 packet: in packet_do_bind, test fanout with bind_lock held
From: Willem de Bruijn <[email protected]>
Once a socket has po->fanout set, it remains a member of the group until it is destroyed. The prot_hook must be constant and identical across sockets in the group.
If fanout_add races with packet_do_bind between the test of po->fanout and taking the lock, the bind call may make type or dev inconsistent with that of the fanout group.
Hold po->bind_lock when testing po->fanout to avoid this race.
I had to introduce artificial delay (local_bh_enable) to actually observe the race.
--- net/packet/af_packet.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/packet/af_packet.c +5 -3
@@ -3071,13 +3071,15 @@ static int packet_do_bind(struct sock *sk, const char *name, int ifindex,int ret =0 ;bool unlisted = false; -if (po->fanout) -return -EINVAL ; -lock_sock (sk);spin_lock (&po->bind_lock);rcu_read_lock (); +if (po->fanout) { + ret = -EINVAL ; + goto out_unlock; + } +if (name) { dev =dev_get_by_name_rcu (sock_net (sk), name);if (!dev) {
Signature · 1 line
2.14.1.821.g8fa685d3b7-goog
David Miller
maintainerFrom: Willem de Bruijn <[email protected]>
Date: Tue, 26 Sep 2017 12:19:37 -0400
Quoted 10 lines
From: Willem de Bruijn <[email protected]>
Once a socket has
po->fanoutset, it remains a member of the group until it is destroyed. Theprot_hookmust be constant and identical across sockets in the group.If
fanout_addraces withpacket_do_bindbetween the test ofpo->fanoutand taking the lock, the bind call may make type or dev inconsistent with that of the fanout group.
Quoted 8 lines
Hold
po->bind_lockwhen testingpo->fanoutto avoid this race.I had to introduce artificial delay (
local_bh_enable) to actually observe the race.Fixes dc99f600698d ("packet: Add fanout support.")Signed-off-by Willem de Bruijn <[email protected]>Reviewed-by Eric Dumazet <[email protected]>
Applied and queued up for -stable.