Committed by
Ray Milkey
Fix a bug when using IpPrefix.contains() and we are mixing IP address
families. The bug (an exception) is triggered when internally we try to create a masked IPv4 address with a very long IPv6-derived mask length. Added the corresponding unit tests. Change-Id: Id835d27ab3ff38dcf7a1387ff32ccb701aa2fe11
Showing
2 changed files
with
32 additions
and
0 deletions
... | @@ -179,6 +179,10 @@ public class IpPrefix { | ... | @@ -179,6 +179,10 @@ public class IpPrefix { |
179 | * otherwise false | 179 | * otherwise false |
180 | */ | 180 | */ |
181 | public boolean contains(IpPrefix other) { | 181 | public boolean contains(IpPrefix other) { |
182 | + if (version() != other.version()) { | ||
183 | + return false; | ||
184 | + } | ||
185 | + | ||
182 | if (this.prefixLength > other.prefixLength) { | 186 | if (this.prefixLength > other.prefixLength) { |
183 | return false; // This prefix has smaller prefix size | 187 | return false; // This prefix has smaller prefix size |
184 | } | 188 | } |
... | @@ -201,6 +205,10 @@ public class IpPrefix { | ... | @@ -201,6 +205,10 @@ public class IpPrefix { |
201 | * false | 205 | * false |
202 | */ | 206 | */ |
203 | public boolean contains(IpAddress other) { | 207 | public boolean contains(IpAddress other) { |
208 | + if (version() != other.version()) { | ||
209 | + return false; | ||
210 | + } | ||
211 | + | ||
204 | // | 212 | // |
205 | // Mask the other address with my prefix length. | 213 | // Mask the other address with my prefix length. |
206 | // If the other prefix is within this prefix, the masked address must | 214 | // If the other prefix is within this prefix, the masked address must | ... | ... |
... | @@ -767,6 +767,12 @@ public class IpPrefixTest { | ... | @@ -767,6 +767,12 @@ public class IpPrefixTest { |
767 | assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); | 767 | assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/16"))); |
768 | assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); | 768 | assertFalse(ipPrefix.contains(IpPrefix.valueOf("0.0.0.0/0"))); |
769 | assertTrue(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); | 769 | assertTrue(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); |
770 | + | ||
771 | + // Test when there is a mistmatch in the compared IP address families | ||
772 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); | ||
773 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1111:2222:3333:4444::/120"))); | ||
774 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); | ||
775 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); | ||
770 | } | 776 | } |
771 | 777 | ||
772 | /** | 778 | /** |
... | @@ -840,6 +846,12 @@ public class IpPrefixTest { | ... | @@ -840,6 +846,12 @@ public class IpPrefixTest { |
840 | assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/0"))); | 846 | assertFalse(ipPrefix.contains(IpPrefix.valueOf("::/0"))); |
841 | assertTrue(ipPrefix.contains( | 847 | assertTrue(ipPrefix.contains( |
842 | IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); | 848 | IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"))); |
849 | + | ||
850 | + // Test when there is a mistmatch in the compared IP address families | ||
851 | + ipPrefix = IpPrefix.valueOf("::/0"); | ||
852 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("1.2.0.0/24"))); | ||
853 | + ipPrefix = IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); | ||
854 | + assertFalse(ipPrefix.contains(IpPrefix.valueOf("255.255.255.255/32"))); | ||
843 | } | 855 | } |
844 | 856 | ||
845 | /** | 857 | /** |
... | @@ -876,6 +888,12 @@ public class IpPrefixTest { | ... | @@ -876,6 +888,12 @@ public class IpPrefixTest { |
876 | assertFalse(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); | 888 | assertFalse(ipPrefix.contains(IpAddress.valueOf("1.3.0.0"))); |
877 | assertFalse(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); | 889 | assertFalse(ipPrefix.contains(IpAddress.valueOf("0.0.0.0"))); |
878 | assertTrue(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); | 890 | assertTrue(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); |
891 | + | ||
892 | + // Test when there is a mistmatch in the compared IP address families | ||
893 | + ipPrefix = IpPrefix.valueOf("0.0.0.0/0"); | ||
894 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("1111:2222:3333:4444::"))); | ||
895 | + ipPrefix = IpPrefix.valueOf("255.255.255.255/32"); | ||
896 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); | ||
879 | } | 897 | } |
880 | 898 | ||
881 | /** | 899 | /** |
... | @@ -929,6 +947,12 @@ public class IpPrefixTest { | ... | @@ -929,6 +947,12 @@ public class IpPrefixTest { |
929 | assertFalse(ipPrefix.contains(IpAddress.valueOf("::"))); | 947 | assertFalse(ipPrefix.contains(IpAddress.valueOf("::"))); |
930 | assertTrue(ipPrefix.contains( | 948 | assertTrue(ipPrefix.contains( |
931 | IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); | 949 | IpAddress.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"))); |
950 | + | ||
951 | + // Test when there is a mistmatch in the compared IP address families | ||
952 | + ipPrefix = IpPrefix.valueOf("::/0"); | ||
953 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("1.2.0.0"))); | ||
954 | + ipPrefix = IpPrefix.valueOf("ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff/128"); | ||
955 | + assertFalse(ipPrefix.contains(IpAddress.valueOf("255.255.255.255"))); | ||
932 | } | 956 | } |
933 | 957 | ||
934 | /** | 958 | /** | ... | ... |
-
Please register or login to post a comment