]> granicus.if.org Git - ipset/commitdiff
Fixed broken ICMP and ICMPv6 handling
authorJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Fri, 21 Jan 2011 20:29:50 +0000 (21:29 +0100)
committerJozsef Kadlecsik <kadlec@blackhole.kfki.hu>
Fri, 21 Jan 2011 20:29:50 +0000 (21:29 +0100)
I mistyped the bitwise operator and the network-order conversion was
missing too. Sigh, sendip cannot generate proper packets to check
ICMP and ICMPv6 in the testsuite. :-(

kernel/ip_set_getport.c

index 968c570ca130297b99c6495f80fa281bdc11302a..76737bba28ee71670ceb95e716b63d14e573fb81 100644 (file)
@@ -47,25 +47,26 @@ get_port(const struct sk_buff *skb, int protocol, unsigned int protooff,
                break;
        }
        case IPPROTO_ICMP: {
-               struct icmphdr _icmph;
+               struct icmphdr _ich;
                const struct icmphdr *ic;
 
-               ic = skb_header_pointer(skb, protooff, sizeof(_icmph), &_icmph);
+               ic = skb_header_pointer(skb, protooff, sizeof(_ich), &_ich);
                if (ic == NULL)
                        return false;
 
-               *port = (__force __be16)((ic->type << 8) & ic->code);
+               *port = (__force __be16)htons((ic->type << 8) | ic->code);
                break;
        }
        case IPPROTO_ICMPV6: {
-               struct icmp6hdr _icmph;
+               struct icmp6hdr _ich;
                const struct icmp6hdr *ic;
 
-               ic = skb_header_pointer(skb, protooff, sizeof(_icmph), &_icmph);
+               ic = skb_header_pointer(skb, protooff, sizeof(_ich), &_ich);
                if (ic == NULL)
                        return false;
 
-               *port = (__force __be16)((ic->icmp6_type << 8) & ic->icmp6_code);
+               *port = (__force __be16)
+                       htons((ic->icmp6_type << 8) | ic->icmp6_code);
                break;
        }
        default: