[IFB]: Fix crash on input device removal

The input_device pointer is not refcounted, which means the device may
disappear while packets are queued, causing a crash when ifb passes packets
with a stale skb->dev pointer to netif_rx().

Fix by storing the interface index instead and do a lookup where neccessary.

Signed-off-by: Patrick McHardy <kaber@trash.net>
Acked-by: Jamal Hadi Salim <hadi@cyberus.ca>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Patrick McHardy
2007-03-29 11:46:52 -07:00
committed by David S. Miller
parent db8b22550d
commit c01003c205
6 changed files with 27 additions and 32 deletions

View File

@@ -352,10 +352,13 @@ tcf_change_indev(struct tcf_proto *tp, char *indev, struct rtattr *indev_tlv)
static inline int
tcf_match_indev(struct sk_buff *skb, char *indev)
{
struct net_device *dev;
if (indev[0]) {
if (!skb->input_dev)
if (!skb->iif)
return 0;
if (strcmp(indev, skb->input_dev->name))
dev = __dev_get_by_index(skb->iif);
if (!dev || strcmp(indev, dev->name))
return 0;
}