can: add sanity checks
Even though the CAN netlayer only deals with CAN netdevices, the netlayer interface to the userspace and to the device layer should perform some sanity checks. This patch adds several sanity checks that mainly prevent userspace apps to send broken content into the system that may be misinterpreted by some other userspace application. Signed-off-by: Oliver Hartkopp <oliver.hartkopp@volkswagen.de> Signed-off-by: Urs Thuermann <urs.thuermann@volkswagen.de> Acked-by: Andre Naujoks <nautsch@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
committed by
David S. Miller
parent
c5a78ac00c
commit
7f2d38eb7a
@@ -205,12 +205,19 @@ static int can_create(struct net *net, struct socket *sock, int protocol)
|
||||
* -ENOBUFS on full driver queue (see net_xmit_errno())
|
||||
* -ENOMEM when local loopback failed at calling skb_clone()
|
||||
* -EPERM when trying to send on a non-CAN interface
|
||||
* -EINVAL when the skb->data does not contain a valid CAN frame
|
||||
*/
|
||||
int can_send(struct sk_buff *skb, int loop)
|
||||
{
|
||||
struct sk_buff *newskb = NULL;
|
||||
struct can_frame *cf = (struct can_frame *)skb->data;
|
||||
int err;
|
||||
|
||||
if (skb->len != sizeof(struct can_frame) || cf->can_dlc > 8) {
|
||||
kfree_skb(skb);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
if (skb->dev->type != ARPHRD_CAN) {
|
||||
kfree_skb(skb);
|
||||
return -EPERM;
|
||||
@@ -605,6 +612,7 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
struct packet_type *pt, struct net_device *orig_dev)
|
||||
{
|
||||
struct dev_rcv_lists *d;
|
||||
struct can_frame *cf = (struct can_frame *)skb->data;
|
||||
int matches;
|
||||
|
||||
if (dev->type != ARPHRD_CAN || dev_net(dev) != &init_net) {
|
||||
@@ -612,6 +620,8 @@ static int can_rcv(struct sk_buff *skb, struct net_device *dev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
BUG_ON(skb->len != sizeof(struct can_frame) || cf->can_dlc > 8);
|
||||
|
||||
/* update statistics */
|
||||
can_stats.rx_frames++;
|
||||
can_stats.rx_frames_delta++;
|
||||
|
Reference in New Issue
Block a user