[PATCH] iseries_veth: Don't leak skbs in RX path
authorMichael Ellerman <michael@ellerman.id.au>
Thu, 12 May 2005 07:55:08 +0000 (17:55 +1000)
committerJeff Garzik <jgarzik@pobox.com>
Sun, 15 May 2005 22:08:05 +0000 (18:08 -0400)
Hi Andrew, Jeff,

Under some strange circumstances the iseries_veth driver can leak skbs.

Fix is simply to call dev_kfree_skb() in the right place.
Fix up the comment as well.

Signed-off-by: Michael Ellerman <michael@ellerman.id.au>
drivers/net/iseries_veth.c

index 1e869df656c1930e5ebab81423cee933822e6d06..1edecb10993de2612860242e069f03fa40e11afd 100644 (file)
@@ -1264,13 +1264,18 @@ static void veth_receive(struct veth_lpar_connection *cnx,
 
                vlan = skb->data[9];
                dev = veth_dev[vlan];
-               if (! dev)
-                       /* Some earlier versions of the driver sent
-                          broadcasts down all connections, even to
-                          lpars that weren't on the relevant vlan.
-                          So ignore packets belonging to a vlan we're
-                          not on. */
+               if (! dev) {
+                       /*
+                        * Some earlier versions of the driver sent
+                        * broadcasts down all connections, even to lpars
+                        * that weren't on the relevant vlan. So ignore
+                        * packets belonging to a vlan we're not on.
+                        * We can also be here if we receive packets while
+                        * the driver is going down, because then dev is NULL.
+                        */
+                       dev_kfree_skb_irq(skb);
                        continue;
+               }
 
                port = (struct veth_port *)dev->priv;
                dest = *((u64 *) skb->data) & 0xFFFFFFFFFFFF0000;