lkml.org 
[lkml]   [2007]   [Dec]   [13]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[patch 59/60] BRIDGE: Properly dereference the br_should_route_hook

    2.6.23-stable review patch. If anyone has any objections, please let us
    know.

    ------------------
    From: Pavel Emelyanov <xemul@openvz.org>

    [BRIDGE]: Properly dereference the br_should_route_hook

    [ Upstream commit: 82de382ce8e1c7645984616728dc7aaa057821e4 ]

    This hook is protected with the RCU, so simple

    if (br_should_route_hook)
    br_should_route_hook(...)

    is not enough on some architectures.

    Use the rcu_dereference/rcu_assign_pointer in this case.

    Fixed Stephen's comment concerning using the typeof().

    Signed-off-by: Pavel Emelyanov <xemul@openvz.org>
    Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
    Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>

    ---
    net/bridge/br_input.c | 7 ++++---
    net/bridge/netfilter/ebtable_broute.c | 4 ++--
    2 files changed, 6 insertions(+), 5 deletions(-)

    --- a/net/bridge/br_input.c
    +++ b/net/bridge/br_input.c
    @@ -122,6 +122,7 @@ static inline int is_link_local(const un
    struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb)
    {
    const unsigned char *dest = eth_hdr(skb)->h_dest;
    + int (*rhook)(struct sk_buff **pskb);

    if (!is_valid_ether_addr(eth_hdr(skb)->h_source))
    goto drop;
    @@ -143,9 +144,9 @@ struct sk_buff *br_handle_frame(struct n

    switch (p->state) {
    case BR_STATE_FORWARDING:
    -
    - if (br_should_route_hook) {
    - if (br_should_route_hook(&skb))
    + rhook = rcu_dereference(br_should_route_hook);
    + if (rhook != NULL) {
    + if (rhook(&skb))
    return skb;
    dest = eth_hdr(skb)->h_dest;
    }
    --- a/net/bridge/netfilter/ebtable_broute.c
    +++ b/net/bridge/netfilter/ebtable_broute.c
    @@ -70,13 +70,13 @@ static int __init ebtable_broute_init(vo
    if (ret < 0)
    return ret;
    /* see br_input.c */
    - br_should_route_hook = ebt_broute;
    + rcu_assign_pointer(br_should_route_hook, ebt_broute);
    return ret;
    }

    static void __exit ebtable_broute_fini(void)
    {
    - br_should_route_hook = NULL;
    + rcu_assign_pointer(br_should_route_hook, NULL);
    synchronize_net();
    ebt_unregister_table(&broute_table);
    }
    --


    \
     
     \ /
      Last update: 2007-12-13 08:23    [W:5.295 / U:0.020 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site