From 86015ffd95a1c141dfa323e25f1aa068c22497be Mon Sep 17 00:00:00 2001 From: Oliver Hartkopp Date: Thu, 8 May 2008 02:49:55 -0700 Subject: [PATCH] --- yaml --- r: 96225 b: refs/heads/master c: c2ab7ac225e29006b7117d6a9fe8f3be8d98b0c2 h: refs/heads/master i: 96223: d75fa7c92c6232107b5269d1f0dee42be72c3cba v: v3 --- [refs] | 2 +- trunk/net/can/af_can.c | 16 ++++++++++++---- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/[refs] b/[refs] index 0cb880799724..56d9161fd27b 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 33f9936b2b73dba6c8685994c441c4fd30b04814 +refs/heads/master: c2ab7ac225e29006b7117d6a9fe8f3be8d98b0c2 diff --git a/trunk/net/can/af_can.c b/trunk/net/can/af_can.c index 2759b76f731c..7e8ca2836452 100644 --- a/trunk/net/can/af_can.c +++ b/trunk/net/can/af_can.c @@ -208,6 +208,7 @@ static int can_create(struct net *net, struct socket *sock, int protocol) */ int can_send(struct sk_buff *skb, int loop) { + struct sk_buff *newskb = NULL; int err; if (skb->dev->type != ARPHRD_CAN) { @@ -244,8 +245,7 @@ int can_send(struct sk_buff *skb, int loop) * If the interface is not capable to do loopback * itself, we do it here. */ - struct sk_buff *newskb = skb_clone(skb, GFP_ATOMIC); - + newskb = skb_clone(skb, GFP_ATOMIC); if (!newskb) { kfree_skb(skb); return -ENOMEM; @@ -254,7 +254,6 @@ int can_send(struct sk_buff *skb, int loop) newskb->sk = skb->sk; newskb->ip_summed = CHECKSUM_UNNECESSARY; newskb->pkt_type = PACKET_BROADCAST; - netif_rx(newskb); } } else { /* indication for the CAN driver: no loopback required */ @@ -266,11 +265,20 @@ int can_send(struct sk_buff *skb, int loop) if (err > 0) err = net_xmit_errno(err); + if (err) { + if (newskb) + kfree_skb(newskb); + return err; + } + + if (newskb) + netif_rx(newskb); + /* update statistics */ can_stats.tx_frames++; can_stats.tx_frames_delta++; - return err; + return 0; } EXPORT_SYMBOL(can_send);