void can_dev_register(struct net_device *dev,
void (*func)(unsigned long msg, void *), void *data)
{
- struct notifier_list *p = kmalloc(GFP_KERNEL, sizeof(*p));
+ struct notifier_list *p = kmalloc(sizeof(*p), GFP_KERNEL);
DBG("called for %s\n", dev->name);
/* insert (dev,canid,mask) -> (func,data) */
if (!(p = kmalloc(sizeof(struct rcv_list), GFP_KERNEL)))
- return;
+ goto out;
p->can_id = can_id;
p->mask = mask;
/* for the throttle functionality */
/* create array for received can_frames */
- if (!(op->last_frames = kmalloc(sizeof(struct can_frame), GFP_KERNEL)))
+ if (!(op->last_frames = kmalloc(sizeof(struct can_frame), GFP_KERNEL))) {
+ kfree(op);
return -ENOMEM;
+ }
/* clear received can_frames to indicate 'nothing received' */
memset(op->last_frames, 0, sizeof(struct can_frame));
skb = alloc_skb(size, GFP_KERNEL);
if ((err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size)) < 0) {
kfree_skb(skb);
+ dev_put(dev);
return err;
}
skb->dev = dev;