[SCTP]: Fix up sctp_rcv return value
authorHerbert Xu <herbert@gondor.apana.org.au>
Sat, 25 Mar 2006 09:25:29 +0000 (01:25 -0800)
committerDavid S. Miller <davem@davemloft.net>
Sat, 25 Mar 2006 09:25:29 +0000 (01:25 -0800)
I was working on the ipip/xfrm problem and as usual I get side-tracked by
other problems.

As part of an attempt to change the IPv4 protocol handler calling
convention I found that SCTP violated the existing convention.

It's returning non-zero values after freeing the skb.  This is doubly bad
as 1) the skb gets resubmitted; 2) the return value is interpreted as a
protocol number.

This patch changes those return values to zero.

IPv6 doesn't suffer from this problem because it uses a positive return
value as an indication for resubmission.  So the only effect of this patch
there is to increment the IPSTATS_MIB_INDELIVERS counter which IMHO is
the right thing to do.

Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/sctp/input.c

index cb78b50868eee0c765884565dbdc4b6d4c2df01b..d117ebc75cf87ce25aa8699f61b4338b12fc1053 100644 (file)
@@ -127,7 +127,6 @@ int sctp_rcv(struct sk_buff *skb)
        union sctp_addr dest;
        int family;
        struct sctp_af *af;
-       int ret = 0;
 
        if (skb->pkt_type!=PACKET_HOST)
                goto discard_it;
@@ -227,16 +226,13 @@ int sctp_rcv(struct sk_buff *skb)
                goto discard_release;
        nf_reset(skb);
 
-       ret = sk_filter(sk, skb, 1);
-       if (ret)
+       if (sk_filter(sk, skb, 1))
                 goto discard_release;
 
        /* Create an SCTP packet structure. */
        chunk = sctp_chunkify(skb, asoc, sk);
-       if (!chunk) {
-               ret = -ENOMEM;
+       if (!chunk)
                goto discard_release;
-       }
        SCTP_INPUT_CB(skb)->chunk = chunk;
 
        /* Remember what endpoint is to handle this packet. */
@@ -277,11 +273,11 @@ int sctp_rcv(struct sk_buff *skb)
        sctp_bh_unlock_sock(sk);
        sock_put(sk);
 
-       return ret;
+       return 0;
 
 discard_it:
        kfree_skb(skb);
-       return ret;
+       return 0;
 
 discard_release:
        /* Release any structures we may be holding. */