index ea29a6d97ef5..5cebeb02527f 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -464,22 +464,29 @@ int can_rx_register(struct net *net, struct net_device *dev, canid_t can_id, spin_lock_bh(&net->can.rcvlists_lock); dev_rcv_lists = can_dev_rcv_lists_find(net, dev); - rcv_list = can_rcv_list_find(&can_id, &mask, dev_rcv_lists); - rcv->can_id = can_id; - rcv->mask = mask; - rcv->matches = 0; - rcv->func = func; - rcv->data = data; - rcv->ident = ident; - rcv->sk = sk; + if (dev_rcv_lists) { + rcv_list = can_rcv_list_find(&can_id, &mask, dev_rcv_lists); + + rcv->can_id = can_id; + rcv->mask = mask; + rcv->matches = 0; + rcv->func = func; + rcv->data = data; + rcv->ident = ident; + rcv->sk = sk; + + hlist_add_head_rcu(&rcv->list, rcv_list); + dev_rcv_lists->entries++; - hlist_add_head_rcu(&rcv->list, rcv_list); - dev_rcv_lists->entries++; + rcv_lists_stats->rcv_entries++; + rcv_lists_stats->rcv_entries_max = max(rcv_lists_stats->rcv_entries_max, + rcv_lists_stats->rcv_entries); + } else { + kmem_cache_free(rcv_cache, rcv); + err = -ENODEV; + } - rcv_lists_stats->rcv_entries++; - rcv_lists_stats->rcv_entries_max = max(rcv_lists_stats->rcv_entries_max, - rcv_lists_stats->rcv_entries); spin_unlock_bh(&net->can.rcvlists_lock); return err;