Patch "packet: avoid out of bounds read in round robin fanout" has been added to the 3.14-stable tree
Subsystems (3)
This is a note to let you know that I've just added the patch titled
packet: avoid out of bounds read in round robin fanout
to the 3.14-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
packet-avoid-out-of-bounds-read-in-round-robin-fanout.patch
and it can be found in the queue-3.14 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Fri Jul 3 19:59:07 PDT 2015
From: Willem de Bruijn <[email protected]>
Date: Wed, 17 Jun 2015 15:59:34 -0400
Subject: packet: avoid out of bounds read in round robin fanout
From: Willem de Bruijn <[email protected]>
[ Upstream commit 468479e6043c84f5a65299cc07cb08a22a28c2b1 ]
PACKET_FANOUT_LB computes f->rr_cur such that it is modulo f->num_members. It returns the old value unconditionally, but f->num_members may have changed since the last store. Ensure that the return value is always < num.
When modifying the logic, simplify it further by replacing the loop with an unconditional atomic increment.
--- net/packet/af_packet.c | 18 ++---------------- 1 file changed, 2 insertions(+), 16 deletions(-)
net/packet/af_packet.c +2 -16
@@ -1264,16 +1264,6 @@ static void packet_sock_destruct(structsk_refcnt_debug_dec (sk); } -static int fanout_rr_next (struct packet_fanout *f,unsigned int num) -{ -int x =atomic_read (&f->rr_cur) +1 ; - -if (x >= num) - x =0 ; - -return x; -} -static unsigned int fanout_demux_hash (struct packet_fanout *f,struct sk_buff *skb,unsigned int num)
@@ -1285,13 +1275,9 @@ static unsigned int fanout_demux_lb(stru struct sk_buff *skb, unsigned int num) { - int cur, old; +unsigned int val =atomic_inc_return (&f->rr_cur); - cur =atomic_read (&f->rr_cur); -while ((old =atomic_cmpxchg (&f->rr_cur, cur, -fanout_rr_next (f, num))) != cur) - cur = old; -return cur; +return val % num; } static unsigned int fanout_demux_cpu(struct packet_fanout *f,
Patches currently in stable-queue which might be from [email protected] are
queue-3.14/packet-avoid-out-of-bounds-read-in-round-robin-fanout.patch queue-3.14/packet-read-num_members-once-in-packet_rcv_fanout.patch