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;