Skip to content

Commit 9bce26f

Browse files
Florian Westphalgregkh
Florian Westphal
authored andcommitted
bridge: drop netfilter fake rtable unconditionally
[ Upstream commit a13b208 ] Andreas reports kernel oops during rmmod of the br_netfilter module. Hannes debugged the oops down to a NULL rt6info->rt6i_indev. Problem is that br_netfilter has the nasty concept of adding a fake rtable to skb->dst; this happens in a br_netfilter prerouting hook. A second hook (in bridge LOCAL_IN) is supposed to remove these again before the skb is handed up the stack. However, on module unload hooks get unregistered which means an skb could traverse the prerouting hook that attaches the fake_rtable, while the 'fake rtable remove' hook gets removed from the hooklist immediately after. Fixes: 34666d4 ("netfilter: bridge: move br_netfilter out of the core") Reported-by: Andreas Karis <[email protected]> Debugged-by: Hannes Frederic Sowa <[email protected]> Signed-off-by: Florian Westphal <[email protected]> Acked-by: Pablo Neira Ayuso <[email protected]> Signed-off-by: David S. Miller <[email protected]> Signed-off-by: Greg Kroah-Hartman <[email protected]>
1 parent 683100e commit 9bce26f

File tree

2 files changed

+1
-21
lines changed

2 files changed

+1
-21
lines changed

net/bridge/br_input.c

+1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ EXPORT_SYMBOL(br_should_route_hook);
2929
static int
3030
br_netif_receive_skb(struct net *net, struct sock *sk, struct sk_buff *skb)
3131
{
32+
br_drop_fake_rtable(skb);
3233
return netif_receive_skb(skb);
3334
}
3435

net/bridge/br_netfilter_hooks.c

-21
Original file line numberDiff line numberDiff line change
@@ -521,21 +521,6 @@ static unsigned int br_nf_pre_routing(void *priv,
521521
}
522522

523523

524-
/* PF_BRIDGE/LOCAL_IN ************************************************/
525-
/* The packet is locally destined, which requires a real
526-
* dst_entry, so detach the fake one. On the way up, the
527-
* packet would pass through PRE_ROUTING again (which already
528-
* took place when the packet entered the bridge), but we
529-
* register an IPv4 PRE_ROUTING 'sabotage' hook that will
530-
* prevent this from happening. */
531-
static unsigned int br_nf_local_in(void *priv,
532-
struct sk_buff *skb,
533-
const struct nf_hook_state *state)
534-
{
535-
br_drop_fake_rtable(skb);
536-
return NF_ACCEPT;
537-
}
538-
539524
/* PF_BRIDGE/FORWARD *************************************************/
540525
static int br_nf_forward_finish(struct net *net, struct sock *sk, struct sk_buff *skb)
541526
{
@@ -905,12 +890,6 @@ static struct nf_hook_ops br_nf_ops[] __read_mostly = {
905890
.hooknum = NF_BR_PRE_ROUTING,
906891
.priority = NF_BR_PRI_BRNF,
907892
},
908-
{
909-
.hook = br_nf_local_in,
910-
.pf = NFPROTO_BRIDGE,
911-
.hooknum = NF_BR_LOCAL_IN,
912-
.priority = NF_BR_PRI_BRNF,
913-
},
914893
{
915894
.hook = br_nf_forward_ip,
916895
.pf = NFPROTO_BRIDGE,

0 commit comments

Comments
 (0)