]> Pileus Git - ~andy/linux/blobdiff - net/can/raw.c
can: omit unneeded skb_clone() calls
[~andy/linux] / net / can / raw.c
index 27aab63df467cce099bc05ce8e1da51ef48ef666..0703cba4bf9f29bc269be1fd57a0215e4f37d420 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