]> rtime.felk.cvut.cz Git - socketcan-devel.git/commitdiff
Correct frame counter in gw_rcv.
authorhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Thu, 18 Feb 2010 21:43:42 +0000 (21:43 +0000)
committerhartkopp <hartkopp@030b6a49-0b11-0410-94ab-b0dab22257f2>
Thu, 18 Feb 2010 21:43:42 +0000 (21:43 +0000)
Fix error path in gw_create_job() to prevent double put of netdevs.

git-svn-id: svn://svn.berlios.de//socketcan/trunk@1128 030b6a49-0b11-0410-94ab-b0dab22257f2

kernel/2.6/net/can/gw.c

index 5ccf0c2045e623b50a4f97897ac4f76b908d8dd5..dafd0790d7d4d6f969a424a38107feeb5df67dab 100644 (file)
@@ -185,8 +185,6 @@ static void gw_rcv(struct sk_buff *skb, void *data)
                return;
        }
 
-       gwj->handled_frames++;
-
        /* mark routed frames with a 'special' sk value */
        nskb->sk = GW_SK_MAGIC;
        nskb->dev = gwj->dst_dev;
@@ -201,6 +199,8 @@ static void gw_rcv(struct sk_buff *skb, void *data)
        /* send to netdevice */
        if (can_send(nskb, gwj->flags & CAN_TX_LOOPBACK))
                gwj->dropped_frames++;
+       else
+               gwj->handled_frames++;
 }
 
 static inline int can_gw_register_filter(struct gw_job *gwj)
@@ -409,8 +409,10 @@ static int gw_create_job(struct sk_buff *skb,  struct nlmsghdr *nlh, void *arg)
        dev_put(gwj->src_dev);
        dev_put(gwj->dst_dev);
 
-       if (!err)
-               return 0;
+       if (err)
+               goto fail;
+
+       return 0;
 
 put_src_dst_fail:
        dev_put(gwj->dst_dev);