netfilter: ipt_ecn: fix inversion for IP header ECN match
authorPatrick McHardy <kaber@trash.net>
Thu, 16 Jun 2011 15:24:55 +0000 (17:24 +0200)
committerPatrick McHardy <kaber@trash.net>
Thu, 16 Jun 2011 15:24:55 +0000 (17:24 +0200)
Userspace allows to specify inversion for IP header ECN matches, the
kernel silently accepts it, but doesn't invert the match result.

Signed-off-by: Patrick McHardy <kaber@trash.net>
net/ipv4/netfilter/ipt_ecn.c

index aaa85be1b2d8bd9c336ffd1c54b806a286e50426..2b57e52c746c4518b914da30775044692a740396 100644 (file)
@@ -25,7 +25,8 @@ MODULE_LICENSE("GPL");
 static inline bool match_ip(const struct sk_buff *skb,
                            const struct ipt_ecn_info *einfo)
 {
-       return (ip_hdr(skb)->tos & IPT_ECN_IP_MASK) == einfo->ip_ect;
+       return ((ip_hdr(skb)->tos & IPT_ECN_IP_MASK) == einfo->ip_ect) ^
+              !!(einfo->invert & IPT_ECN_OP_MATCH_IP);
 }
 
 static inline bool match_tcp(const struct sk_buff *skb,