| From stable-bounces@linux.kernel.org Tue Nov 13 00:08:07 2007 |
| From: Evgeniy Polyakov <johnpol@2ka.mipt.ru> |
| Date: Tue, 13 Nov 2007 00:07:45 -0800 (PST) |
| Subject: Fix TEQL oops. |
| To: stable@kernel.org |
| Cc: bunk@kernel.org |
| Message-ID: <20071113.000745.02473542.davem@davemloft.net> |
| |
| From: Evgeniy Polyakov <johnpol@2ka.mipt.ru> |
| |
| [PKT_SCHED]: Fix OOPS when removing devices from a teql queuing discipline |
| |
| [ Upstream commit: 4f9f8311a08c0d95c70261264a2b47f2ae99683a ] |
| |
| tecl_reset() is called from deactivate and qdisc is set to noop already, |
| but subsequent teql_xmit does not know about it and dereference private |
| data as teql qdisc and thus oopses. |
| not catch it first :) |
| |
| Signed-off-by: Evgeniy Polyakov <johnpol@2ka.mipt.ru> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| net/sched/sch_teql.c | 3 +++ |
| 1 file changed, 3 insertions(+) |
| |
| --- a/net/sched/sch_teql.c |
| +++ b/net/sched/sch_teql.c |
| @@ -263,6 +263,9 @@ __teql_resolve(struct sk_buff *skb, stru |
| static __inline__ int |
| teql_resolve(struct sk_buff *skb, struct sk_buff *skb_res, struct net_device *dev) |
| { |
| + if (dev->qdisc == &noop_qdisc) |
| + return -ENODEV; |
| + |
| if (dev->hard_header == NULL || |
| skb->dst == NULL || |
| skb->dst->neighbour == NULL) |