X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=net%2Fcan%2Fraw.c;h=6aa154e806ae722c53e71603c0b22865526452a0;hb=6e15cf04860074ad032e88c306bea656bbdd0f22;hp=27aab63df467cce099bc05ce8e1da51ef48ef666;hpb=52435bfc665716fdf9a02f0d08e7ce50ddb9bf45;p=~andy%2Flinux diff --git a/net/can/raw.c b/net/can/raw.c index 27aab63df46..6aa154e806a 100644 --- a/net/can/raw.c +++ b/net/can/raw.c @@ -99,13 +99,14 @@ static void raw_rcv(struct sk_buff *skb, void *data) struct raw_sock *ro = raw_sk(sk); struct sockaddr_can *addr; - if (!ro->recv_own_msgs) { - /* check the received tx sock reference */ - if (skb->sk == sk) { - kfree_skb(skb); - return; - } - } + /* check the received tx sock reference */ + if (!ro->recv_own_msgs && skb->sk == sk) + return; + + /* clone the given skb to be able to enqueue it into the rcv queue */ + skb = skb_clone(skb, GFP_ATOMIC); + if (!skb) + return; /* * Put the datagram to the queue so that raw_recvmsg() can @@ -645,6 +646,9 @@ static int raw_sendmsg(struct kiocb *iocb, struct socket *sock, goto put_dev; err = memcpy_fromiovec(skb_put(skb, size), msg->msg_iov, size); + if (err < 0) + goto free_skb; + err = sock_tx_timestamp(msg, sk, skb_tx(skb)); if (err < 0) goto free_skb; skb->dev = dev;