]> Pileus Git - ~andy/linux/blobdiff - net/can/raw.c
Merge branch 'core/percpu' into percpu-cpumask-x86-for-linus-2
[~andy/linux] / net / can / raw.c
index 27aab63df467cce099bc05ce8e1da51ef48ef666..6aa154e806ae722c53e71603c0b22865526452a0 100644 (file)
@@ -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;