Skip to content

Commit 8016a19

Browse files
Bruno Studerjzheaux
authored andcommitted
Optimize IpAddressMatcher
Get rid of byte array allocation in matcher and small optimizations
1 parent 3c14725 commit 8016a19

File tree

1 file changed

+8
-14
lines changed

1 file changed

+8
-14
lines changed

web/src/main/java/org/springframework/security/web/util/matcher/IpAddressMatcher.java

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,6 @@
1717

1818
import java.net.InetAddress;
1919
import java.net.UnknownHostException;
20-
import java.util.Arrays;
2120

2221
import javax.servlet.http.HttpServletRequest;
2322

@@ -76,26 +75,21 @@ public boolean matches(String address) {
7675
byte[] remAddr = remoteAddress.getAddress();
7776
byte[] reqAddr = requiredAddress.getAddress();
7877

79-
int oddBits = nMaskBits % 8;
80-
int nMaskBytes = nMaskBits / 8 + (oddBits == 0 ? 0 : 1);
81-
byte[] mask = new byte[nMaskBytes];
82-
83-
Arrays.fill(mask, 0, oddBits == 0 ? mask.length : mask.length - 1, (byte) 0xFF);
84-
85-
if (oddBits != 0) {
86-
int finalByte = (1 << oddBits) - 1;
87-
finalByte <<= 8 - oddBits;
88-
mask[mask.length - 1] = (byte) finalByte;
89-
}
78+
int nMaskFullBytes = nMaskBits / 8;
79+
byte finalByte = (byte) (0xFF00 >> (nMaskBits & 0x07));
9080

9181
// System.out.println("Mask is " + new sun.misc.HexDumpEncoder().encode(mask));
9282

93-
for (int i = 0; i < mask.length; i++) {
94-
if ((remAddr[i] & mask[i]) != (reqAddr[i] & mask[i])) {
83+
for (int i = 0; i < nMaskFullBytes; i++) {
84+
if (remAddr[i] != reqAddr[i]) {
9585
return false;
9686
}
9787
}
9888

89+
if (finalByte != 0) {
90+
return (remAddr[nMaskFullBytes] & finalByte) == (reqAddr[nMaskFullBytes] & finalByte);
91+
}
92+
9993
return true;
10094
}
10195

0 commit comments

Comments
 (0)