diff options
author | Herbert Xu <herbert@gondor.apana.org.au> | 2006-03-25 01:25:29 -0800 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2006-03-25 01:25:29 -0800 |
commit | 2babf9daae4a3561f3264638a22ac7d0b14a6f52 (patch) | |
tree | 1fd884975fe0d8e9cf7e840a9eabf1be7429c130 /net/sctp | |
parent | 9f514950bb907e98f280492a091aa1889b97304e (diff) | |
download | linux-stable-2babf9daae4a3561f3264638a22ac7d0b14a6f52.tar.gz linux-stable-2babf9daae4a3561f3264638a22ac7d0b14a6f52.tar.bz2 linux-stable-2babf9daae4a3561f3264638a22ac7d0b14a6f52.zip |
[SCTP]: Fix up sctp_rcv return value
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>
Diffstat (limited to 'net/sctp')
-rw-r--r-- | net/sctp/input.c | 12 |
1 files changed, 4 insertions, 8 deletions
diff --git a/net/sctp/input.c b/net/sctp/input.c index cb78b50868ee..d117ebc75cf8 100644 --- a/net/sctp/input.c +++ b/net/sctp/input.c @@ -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. */ |