ax25: join the return paths that free skb
authorIlpo Järvinen <ilpo.jarvinen@helsinki.fi>
Mon, 15 Dec 2008 07:17:26 +0000 (23:17 -0800)
committerDavid S. Miller <davem@davemloft.net>
Mon, 15 Dec 2008 07:17:26 +0000 (23:17 -0800)
Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@helsinki.fi>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ax25/ax25_in.c

index 4a5ba97..5f1d210 100644 (file)
@@ -200,19 +200,15 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
 
        skb_reset_transport_header(skb);
 
-       if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL) {
-               kfree_skb(skb);
-               return 0;
-       }
+       if ((ax25_dev = ax25_dev_ax25dev(dev)) == NULL)
+               goto free;
 
        /*
         *      Parse the address header.
         */
 
-       if (ax25_addr_parse(skb->data, skb->len, &src, &dest, &dp, &type, &dama) == NULL) {
-               kfree_skb(skb);
-               return 0;
-       }
+       if (ax25_addr_parse(skb->data, skb->len, &src, &dest, &dp, &type, &dama) == NULL)
+               goto free;
 
        /*
         *      Ours perhaps ?
@@ -239,10 +235,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
 
                ax25_send_to_raw(&dest, skb, skb->data[1]);
 
-               if (!mine && ax25cmp(&dest, (ax25_address *)dev->broadcast) != 0) {
-                       kfree_skb(skb);
-                       return 0;
-               }
+               if (!mine && ax25cmp(&dest, (ax25_address *)dev->broadcast) != 0)
+                       goto free;
 
                /* Now we are pointing at the pid byte */
                switch (skb->data[1]) {
@@ -301,10 +295,8 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
         *      If not, should we DM the incoming frame (except DMs) or
         *      silently ignore them. For now we stay quiet.
         */
-       if (ax25_dev->values[AX25_VALUES_CONMODE] == 0) {
-               kfree_skb(skb);
-               return 0;
-       }
+       if (ax25_dev->values[AX25_VALUES_CONMODE] == 0)
+               goto free;
 
        /* LAPB */
 
@@ -339,8 +331,7 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
                if ((*skb->data & ~AX25_PF) != AX25_DM && mine)
                        ax25_return_dm(dev, &src, &dest, &dp);
 
-               kfree_skb(skb);
-               return 0;
+               goto free;
        }
 
        /* b) received SABM(E) */
@@ -372,15 +363,12 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
                sk->sk_ack_backlog++;
                bh_unlock_sock(sk);
        } else {
-               if (!mine) {
-                       kfree_skb(skb);
-                       return 0;
-               }
+               if (!mine)
+                       goto free;
 
                if ((ax25 = ax25_create_cb()) == NULL) {
                        ax25_return_dm(dev, &src, &dest, &dp);
-                       kfree_skb(skb);
-                       return 0;
+                       goto free;
                }
 
                ax25_fillin_cb(ax25, ax25_dev);
@@ -436,9 +424,10 @@ static int ax25_rcv(struct sk_buff *skb, struct net_device *dev,
                if (!sock_flag(sk, SOCK_DEAD))
                        sk->sk_data_ready(sk, skb->len);
                sock_put(sk);
-       } else
+       } else {
+free:
                kfree_skb(skb);
-
+       }
        return 0;
 }