bridge: Fix update_pmtu crash with GRE

Submitted by Herbert Xu on Nov. 24, 2008, 6:49 a.m.

Details

Message ID 20081124064957.GA15999@gondor.apana.org.au
State Superseded
Delegated to: David Miller
Headers show

Commit Message

Herbert Xu Nov. 24, 2008, 6:49 a.m.
On Thu, Oct 09, 2008 at 06:39:56PM +0800, Herbert Xu wrote:
>
> > +/*
> > + * We've finished passing through netfilter, so we can remove the fake dst.
> > + * This is required by some lower layers, eg ip_gre
> > + */
> > +static int br_nf_dev_queue_xmit_finish(struct sk_buff *skb)
> > +{
> > +	if (skb->dst == (struct dst_entry *)&__fake_rtable) {
> > +		dst_release(skb->dst);
> > +		skb->dst = NULL;
> > +	}
> > +
> > +	return br_dev_queue_push_xmit(skb);
> > +}
> 
> Alternatively we could give fake_rtable an ops structure.

Looks like this fell through the cracks:

bridge: Fix update_pmtu crash with GRE

As GRE tries to call the update_pmtu function on skb->dst and
bridge supplies an skb->dst that has a NULL ops field, all is
not well.

This patch fixes this by giving the bridge device an ops field
with an update_pmtu function.  For the moment I've left all
other fields blank but we can fill them in later should the
need arise.

Based on report and patch by Philip Craig.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>


Cheers,

Comments

Patrick McHardy Nov. 24, 2008, 12:35 p.m.
Herbert Xu wrote:
> Looks like this fell through the cracks:
> 
> bridge: Fix update_pmtu crash with GRE
> 
> As GRE tries to call the update_pmtu function on skb->dst and
> bridge supplies an skb->dst that has a NULL ops field, all is
> not well.
> 
> This patch fixes this by giving the bridge device an ops field
> with an update_pmtu function.  For the moment I've left all
> other fields blank but we can fill them in later should the
> need arise.
> 
> Based on report and patch by Philip Craig.

Applied, thanks Herbert.

--
To unsubscribe from this list: send the line "unsubscribe netdev" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Patch hide | download patch | download mbox

diff --git a/net/bridge/br_netfilter.c b/net/bridge/br_netfilter.c
index fa5cda4..45f61c3 100644
--- a/net/bridge/br_netfilter.c
+++ b/net/bridge/br_netfilter.c
@@ -101,6 +101,18 @@  static inline __be16 pppoe_proto(const struct sk_buff *skb)
 	 pppoe_proto(skb) == htons(PPP_IPV6) && \
 	 brnf_filter_pppoe_tagged)
 
+static void fake_update_pmtu(struct dst_entry *dst, u32 mtu)
+{
+}
+
+static struct dst_ops fake_dst_ops = {
+	.family =		AF_INET,
+	.protocol =		__constant_htons(ETH_P_IP),
+	.update_pmtu =		fake_update_pmtu,
+	.entry_size =		sizeof(struct rtable),
+	.entries =		ATOMIC_INIT(0),
+};
+
 /*
  * Initialize bogus route table used to keep netfilter happy.
  * Currently, we fill in the PMTU entry because netfilter
@@ -117,6 +129,7 @@  void br_netfilter_rtable_init(struct net_bridge *br)
 	rt->u.dst.path = &rt->u.dst;
 	rt->u.dst.metrics[RTAX_MTU - 1] = 1500;
 	rt->u.dst.flags	= DST_NOXFRM;
+	rt->u.dst.ops = &fake_dst_ops;
 }
 
 static inline struct rtable *bridge_parent_rtable(const struct net_device *dev)