This commit was manufactured by cvs2svn to create tag
[linux-2.6.git] / net / ipv6 / netfilter / ip6t_multiport.c
index 6e32461..7250415 100644 (file)
@@ -53,32 +53,28 @@ match(const struct sk_buff *skb,
       const struct net_device *out,
       const void *matchinfo,
       int offset,
-      unsigned int protoff,
+      const void *hdr,
+      u_int16_t datalen,
       int *hotdrop)
 {
-       u16 _ports[2], *pptr;
+       const struct udphdr *udp = hdr;
        const struct ip6t_multiport *multiinfo = matchinfo;
 
-       /* Must not be a fragment. */
-       if (offset)
-               return 0;
-
-       /* Must be big enough to read ports (both UDP and TCP have
-          them at the start). */
-       pptr = skb_header_pointer(skb, protoff, sizeof(_ports), &_ports[0]);
-       if (pptr == NULL) {
+       /* Must be big enough to read ports. */
+       if (offset == 0 && datalen < sizeof(struct udphdr)) {
                /* We've been asked to examine this packet, and we
-                * can't.  Hence, no choice but to drop.
-                */
-               duprintf("ip6t_multiport:"
-                        " Dropping evil offset=0 tinygram.\n");
-               *hotdrop = 1;
-               return 0;
+                  can't.  Hence, no choice but to drop. */
+                       duprintf("ip6t_multiport:"
+                                " Dropping evil offset=0 tinygram.\n");
+                       *hotdrop = 1;
+                       return 0;
        }
 
-       return ports_match(multiinfo->ports,
-                          multiinfo->flags, multiinfo->count,
-                          ntohs(pptr[0]), ntohs(pptr[1]));
+       /* Must not be a fragment. */
+       return !offset
+               && ports_match(multiinfo->ports,
+                              multiinfo->flags, multiinfo->count,
+                              ntohs(udp->source), ntohs(udp->dest));
 }
 
 /* Called when user tries to insert an entry of this type. */
@@ -91,12 +87,9 @@ checkentry(const char *tablename,
 {
        const struct ip6t_multiport *multiinfo = matchinfo;
 
-       if (matchsize != IP6T_ALIGN(sizeof(struct ip6t_multiport)))
-               return 0;
-
        /* Must specify proto == TCP/UDP, no unknown flags or bad count */
        return (ip->proto == IPPROTO_TCP || ip->proto == IPPROTO_UDP)
-               && !(ip->invflags & IP6T_INV_PROTO)
+               && !(ip->flags & IP6T_INV_PROTO)
                && matchsize == IP6T_ALIGN(sizeof(struct ip6t_multiport))
                && (multiinfo->flags == IP6T_MULTIPORT_SOURCE
                    || multiinfo->flags == IP6T_MULTIPORT_DESTINATION