xfrm4: fix the ports decode of sctp protocol
authorWei Yongjun <yjwei@cn.fujitsu.com>
Thu, 2 Jul 2009 16:57:23 +0000 (16:57 +0000)
committerDavid S. Miller <davem@davemloft.net>
Sat, 4 Jul 2009 02:10:06 +0000 (19:10 -0700)
The SCTP pushed the skb data above the sctp chunk header, so the check
of pskb_may_pull(skb, xprth + 4 - skb->data) in _decode_session4() will
never return 0 because xprth + 4 - skb->data < 0, the ports decode of
sctp will always fail.

Signed-off-by: Wei Yongjun <yjwei@cn.fujitsu.com>
Acked-by: Herbert Xu <herbert@gondor.apana.org.au>
Signed-off-by: David S. Miller <davem@davemloft.net>
net/ipv4/xfrm4_policy.c

index 60d918c96a4fff19c0d4062558ea8c594fa9bef2..0071ee6f441f1236d953f6a2f0f6b3cd8d67e758 100644 (file)
@@ -136,7 +136,8 @@ _decode_session4(struct sk_buff *skb, struct flowi *fl, int reverse)
                case IPPROTO_TCP:
                case IPPROTO_SCTP:
                case IPPROTO_DCCP:
-                       if (pskb_may_pull(skb, xprth + 4 - skb->data)) {
+                       if (xprth + 4 < skb->data ||
+                           pskb_may_pull(skb, xprth + 4 - skb->data)) {
                                __be16 *ports = (__be16 *)xprth;
 
                                fl->fl_ip_sport = ports[!!reverse];