lkml.org 
[lkml]   [2019]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.1 30/62] net: bridge: dont cache ether dest pointer on input
    Date
    From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>

    [ Upstream commit 3d26eb8ad1e9b906433903ce05f775cf038e747f ]

    We would cache ether dst pointer on input in br_handle_frame_finish but
    after the neigh suppress code that could lead to a stale pointer since
    both ipv4 and ipv6 suppress code do pskb_may_pull. This means we have to
    always reload it after the suppress code so there's no point in having
    it cached just retrieve it directly.

    Fixes: 057658cb33fbf ("bridge: suppress arp pkts on BR_NEIGH_SUPPRESS ports")
    Fixes: ed842faeb2bd ("bridge: suppress nd pkts on BR_NEIGH_SUPPRESS ports")
    Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
    ---
    net/bridge/br_input.c | 8 +++-----
    1 file changed, 3 insertions(+), 5 deletions(-)

    --- a/net/bridge/br_input.c
    +++ b/net/bridge/br_input.c
    @@ -79,7 +79,6 @@ int br_handle_frame_finish(struct net *n
    struct net_bridge_fdb_entry *dst = NULL;
    struct net_bridge_mdb_entry *mdst;
    bool local_rcv, mcast_hit = false;
    - const unsigned char *dest;
    struct net_bridge *br;
    u16 vid = 0;

    @@ -97,10 +96,9 @@ int br_handle_frame_finish(struct net *n
    br_fdb_update(br, p, eth_hdr(skb)->h_source, vid, false);

    local_rcv = !!(br->dev->flags & IFF_PROMISC);
    - dest = eth_hdr(skb)->h_dest;
    - if (is_multicast_ether_addr(dest)) {
    + if (is_multicast_ether_addr(eth_hdr(skb)->h_dest)) {
    /* by definition the broadcast is also a multicast address */
    - if (is_broadcast_ether_addr(dest)) {
    + if (is_broadcast_ether_addr(eth_hdr(skb)->h_dest)) {
    pkt_type = BR_PKT_BROADCAST;
    local_rcv = true;
    } else {
    @@ -150,7 +148,7 @@ int br_handle_frame_finish(struct net *n
    }
    break;
    case BR_PKT_UNICAST:
    - dst = br_fdb_find_rcu(br, dest, vid);
    + dst = br_fdb_find_rcu(br, eth_hdr(skb)->h_dest, vid);
    default:
    break;
    }

    \
     
     \ /
      Last update: 2019-07-26 17:38    [W:4.177 / U:0.044 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site