• Hong Zhiguo's avatar
    bridge: fix NULL pointer deref of br_port_get_rcu · 716ec052
    Hong Zhiguo authored
    The NULL deref happens when br_handle_frame is called between these
    2 lines of del_nbp:
    	dev->priv_flags &= ~IFF_BRIDGE_PORT;
    	/* --> br_handle_frame is called at this time */
    	netdev_rx_handler_unregister(dev);
    
    In br_handle_frame the return of br_port_get_rcu(dev) is dereferenced
    without check but br_port_get_rcu(dev) returns NULL if:
    	!(dev->priv_flags & IFF_BRIDGE_PORT)
    
    Eric Dumazet pointed out the testing of IFF_BRIDGE_PORT is not necessary
    here since we're in rcu_read_lock and we have synchronize_net() in
    netdev_rx_handler_unregister. So remove the testing of IFF_BRIDGE_PORT
    and by the previous patch, make sure br_port_get_rcu is called in
    bridging code.
    Signed-off-by: default avatarHong Zhiguo <zhiguohong@tencent.com>
    Acked-by: default avatarEric Dumazet <edumazet@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    716ec052
br_private.h 22.3 KB