Skip to content

Commit ae944df

Browse files
authored
Fix offset handling in ipv6 parsing (#133192)
1 parent fbe92f9 commit ae944df

File tree

3 files changed

+37
-23
lines changed

3 files changed

+37
-23
lines changed

muted-tests.yml

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -576,24 +576,6 @@ tests:
576576
- class: org.elasticsearch.xpack.ml.integration.TextEmbeddingQueryIT
577577
method: testModelWithPrefixStrings
578578
issue: https://github.com/elastic/elasticsearch/issues/133138
579-
- class: org.elasticsearch.index.mapper.blockloader.IpFieldBlockLoaderTests
580-
method: testBlockLoaderOfMultiField {preference=Params[syntheticSource=true, preference=DOC_VALUES]}
581-
issue: https://github.com/elastic/elasticsearch/issues/133149
582-
- class: org.elasticsearch.index.mapper.blockloader.IpFieldBlockLoaderTests
583-
method: testBlockLoaderOfMultiField {preference=Params[syntheticSource=true, preference=STORED]}
584-
issue: https://github.com/elastic/elasticsearch/issues/133150
585-
- class: org.elasticsearch.index.mapper.blockloader.IpFieldBlockLoaderTests
586-
method: testBlockLoaderOfMultiField {preference=Params[syntheticSource=true, preference=NONE]}
587-
issue: https://github.com/elastic/elasticsearch/issues/133151
588-
- class: org.elasticsearch.index.mapper.blockloader.IpFieldBlockLoaderTests
589-
method: testBlockLoaderForFieldInObject {preference=Params[syntheticSource=true, preference=STORED]}
590-
issue: https://github.com/elastic/elasticsearch/issues/133178
591-
- class: org.elasticsearch.index.mapper.blockloader.IpFieldBlockLoaderTests
592-
method: testBlockLoaderForFieldInObject {preference=Params[syntheticSource=true, preference=DOC_VALUES]}
593-
issue: https://github.com/elastic/elasticsearch/issues/133179
594-
- class: org.elasticsearch.index.mapper.blockloader.IpFieldBlockLoaderTests
595-
method: testBlockLoaderForFieldInObject {preference=Params[syntheticSource=true, preference=NONE]}
596-
issue: https://github.com/elastic/elasticsearch/issues/133180
597579
- class: org.elasticsearch.test.rest.yaml.CcsCommonYamlTestSuiteIT
598580
method: test {p0=search.vectors/90_sparse_vector/Indexing and searching multi-value sparse vectors in >=8.15}
599581
issue: https://github.com/elastic/elasticsearch/issues/133184

server/src/main/java/org/elasticsearch/common/network/InetAddresses.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,8 @@ private static byte[] textToNumericFormatV6(byte[] ipUtf8, int offset, int lengt
239239
return null; // Invalid character
240240
}
241241
}
242-
if (currentHextetStart != length) {
243-
// Handle the last hextet
242+
// Handle the last hextet unless the IP address ends with ::
243+
if (currentHextetStart < offset + length) {
244244
if (putHextet(bytes, currentHextet) == false) {
245245
return null;
246246
}

server/src/test/java/org/elasticsearch/common/network/InetAddressesTests.java

Lines changed: 35 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import java.net.UnknownHostException;
2828
import java.nio.charset.StandardCharsets;
2929
import java.util.Enumeration;
30+
import java.util.List;
3031
import java.util.Locale;
3132

3233
import static org.hamcrest.Matchers.equalTo;
@@ -180,10 +181,12 @@ public void testConvertDottedQuadToHex() throws UnknownHostException {
180181
// Shouldn't hit DNS, because it's an IP string literal.
181182
InetAddress ipv6Addr = InetAddress.getByName(ipString);
182183
assertEquals(ipv6Addr, InetAddresses.forString(ipString));
184+
int extraLength = randomInt(8);
185+
int offset = randomInt(extraLength);
183186
byte[] asBytes = ipString.getBytes(StandardCharsets.UTF_8);
184-
byte[] bytes = new byte[32];
185-
System.arraycopy(asBytes, 0, bytes, 8, asBytes.length);
186-
assertEquals(ipv6Addr, InetAddresses.forString(bytes, 8, asBytes.length));
187+
byte[] bytes = new byte[asBytes.length + extraLength];
188+
System.arraycopy(asBytes, 0, bytes, offset, asBytes.length);
189+
assertEquals(ipv6Addr, InetAddresses.forString(bytes, offset, asBytes.length));
187190
assertTrue(InetAddresses.isInetAddress(ipString));
188191
}
189192
}
@@ -206,6 +209,35 @@ public void testToAddrStringIPv6() {
206209
assertEquals("::1", InetAddresses.toAddrString(InetAddresses.forString("0:0:0:0:0:0:0:1")));
207210
assertEquals("2001:658:22a:cafe::", InetAddresses.toAddrString(InetAddresses.forString("2001:0658:022a:cafe::")));
208211
assertEquals("::102:304", InetAddresses.toAddrString(InetAddresses.forString("::1.2.3.4")));
212+
assertEquals("2001:db8::1:0:0:1", InetAddresses.toAddrString(InetAddresses.forString("2001:db8::1:0:0:1")));
213+
}
214+
215+
public void testWithOffsets() {
216+
List<String> ipStrings = List.of(
217+
"1:2:3:4:5:6:7:8",
218+
"2001:0:0:4::8",
219+
"2001::4:5:6:7:8",
220+
"2001:0:3:4:5:6:7:8",
221+
"0:0:3::ffff",
222+
"::4:0:0:0:ffff",
223+
"::5:0:0:ffff",
224+
"1::4:0:0:7:8",
225+
"::",
226+
"::1",
227+
"2001:658:22a:cafe::",
228+
"::102:304",
229+
"2001:db8::1:0:0:1",
230+
"2001:db8::1:0:1:0"
231+
);
232+
for (String ipString : ipStrings) {
233+
byte[] bytes = ipString.getBytes(StandardCharsets.UTF_8);
234+
int extraLength = randomInt(8);
235+
int offset = randomInt(extraLength);
236+
byte[] bytesWithPadding = new byte[bytes.length + extraLength];
237+
System.arraycopy(bytes, 0, bytesWithPadding, offset, bytes.length);
238+
InetAddress addr = InetAddresses.forString(bytesWithPadding, offset, bytes.length);
239+
assertEquals(ipString, InetAddresses.toAddrString(addr));
240+
}
209241
}
210242

211243
public void testToUriStringIPv4() {

0 commit comments

Comments
 (0)