can: deny filterlist access on non-CAN interfaces
authorOliver Hartkopp <oliver@hartkopp.net>
Tue, 2 Feb 2010 15:21:34 +0000 (07:21 -0800)
committerDavid S. Miller <davem@davemloft.net>
Tue, 2 Feb 2010 15:21:34 +0000 (07:21 -0800)
In commit 20dd3850bcf860561496827b711fa10fecf6e787 "can: Speed up CAN frame
receiption by using ml_priv" the formerly used hlist of receiver lists for
each CAN netdevice has been replaced.

The hlist content ensured only CAN netdevices to be accessed by the
can_rx_(un)register() functions which accidently dropped away together with
the hlist receiver implementation.

This patch re-introduces the check for CAN netdevices in can_rx_(un)register().

Signed-off-by: Oliver Hartkopp <oliver@hartkopp.net>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/can/af_can.c

index bc18b084ffdb7351009e85a50aa1e676132ca4ad..702be5a2c956fd3e14ed8b7caadf3a3a9a07fbf1 100644 (file)
@@ -415,6 +415,9 @@ int can_rx_register(struct net_device *dev, canid_t can_id, canid_t mask,
 
        /* insert new receiver  (dev,canid,mask) -> (func,data) */
 
+       if (dev && dev->type != ARPHRD_CAN)
+               return -ENODEV;
+
        r = kmem_cache_alloc(rcv_cache, GFP_KERNEL);
        if (!r)
                return -ENOMEM;
@@ -478,6 +481,9 @@ void can_rx_unregister(struct net_device *dev, canid_t can_id, canid_t mask,
        struct hlist_node *next;
        struct dev_rcv_lists *d;
 
+       if (dev && dev->type != ARPHRD_CAN)
+               return;
+
        spin_lock(&can_rcvlists_lock);
 
        d = find_dev_rcv_lists(dev);