diff options
author | David S. Miller <davem@davemloft.net> | 2008-07-08 16:30:17 -0700 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2008-07-08 16:30:17 -0700 |
commit | 7c3ceb4a409e2b838700edf081d61a8a4c921e79 (patch) | |
tree | 4dbf54cc23d2796b278e22fc6f5460b9b451c956 /net/can/af_can.c | |
parent | 54dceb008ffcbe003bea9017cad1227a83b6fc3f (diff) | |
parent | b2238566401f01eb796e75750213c7b0fce396b2 (diff) | |
download | linux-stable-7c3ceb4a409e2b838700edf081d61a8a4c921e79.tar.gz linux-stable-7c3ceb4a409e2b838700edf081d61a8a4c921e79.tar.bz2 linux-stable-7c3ceb4a409e2b838700edf081d61a8a4c921e79.zip |
Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts:
drivers/net/wireless/iwlwifi/iwl-3945.c
net/mac80211/mlme.c
Diffstat (limited to 'net/can/af_can.c')
-rw-r--r-- | net/can/af_can.c | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/net/can/af_can.c b/net/can/af_can.c index 7e8ca2836452..484bbf6dd032 100644 --- a/net/can/af_can.c +++ b/net/can/af_can.c @@ -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++; |