netfilter: xt_multiport: Fix wrong unmatch result with multiple ports
authorGao Feng <fgao@ikuai8.com>
Fri, 25 Nov 2016 04:32:07 +0000 (12:32 +0800)
committerPablo Neira Ayuso <pablo@netfilter.org>
Tue, 6 Dec 2016 20:48:20 +0000 (21:48 +0100)
I lost one test case in the last commit for xt_multiport.
For example, the rule is "-m multiport --dports 22,80,443".
When first port is unmatched and the second is matched, the curent codes
could not return the right result.
It would return false directly when the first port is unmatched.

Fixes: dd2602d00f80 ("netfilter: xt_multiport: Use switch case instead
of multiple condition checks")
Signed-off-by: Gao Feng <fgao@ikuai8.com>
Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
net/netfilter/xt_multiport.c

index ec06fb1cb16fccd2bfe2bcb9698316a69780e50b..1cde0e4985b73f75d82fa98f8e62f1bf47d1a02a 100644 (file)
@@ -44,12 +44,18 @@ ports_match_v1(const struct xt_multiport_v1 *minfo,
 
                        switch (minfo->flags) {
                        case XT_MULTIPORT_SOURCE:
-                               return (src >= s && src <= e) ^ minfo->invert;
+                               if (src >= s && src <= e)
+                                       return true ^ minfo->invert;
+                               break;
                        case XT_MULTIPORT_DESTINATION:
-                               return (dst >= s && dst <= e) ^ minfo->invert;
+                               if (dst >= s && dst <= e)
+                                       return true ^ minfo->invert;
+                               break;
                        case XT_MULTIPORT_EITHER:
-                               return ((dst >= s && dst <= e) ||
-                                       (src >= s && src <= e)) ^ minfo->invert;
+                               if ((dst >= s && dst <= e) ||
+                                   (src >= s && src <= e))
+                                       return true ^ minfo->invert;
+                               break;
                        default:
                                break;
                        }
@@ -59,11 +65,17 @@ ports_match_v1(const struct xt_multiport_v1 *minfo,
 
                        switch (minfo->flags) {
                        case XT_MULTIPORT_SOURCE:
-                               return (src == s) ^ minfo->invert;
+                               if (src == s)
+                                       return true ^ minfo->invert;
+                               break;
                        case XT_MULTIPORT_DESTINATION:
-                               return (dst == s) ^ minfo->invert;
+                               if (dst == s)
+                                       return true ^ minfo->invert;
+                               break;
                        case XT_MULTIPORT_EITHER:
-                               return (src == s || dst == s) ^ minfo->invert;
+                               if (src == s || dst == s)
+                                       return true ^ minfo->invert;
+                               break;
                        default:
                                break;
                        }