You are viewing a plain text version of this content. The canonical link for it is here.
Posted to common-commits@hadoop.apache.org by we...@apache.org on 2026/10/26 17:40:27 UTC
(hadoop) branch trunk updated: HDFS-18011. DataTransferSaslUtil.getPeerAddress fails on IPv6 peer addresses (#8851)
This is an automated email from the ASF dual-hosted git repository.
jojochuang pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/hadoop.git
The following commit(s) were added to refs/heads/trunk by this push:
new f8422975702 HDFS-18011. DataTransferSaslUtil.getPeerAddress fails on IPv6 peer addresses (#8851)
f8422975702 is described below
commit f842297570243587f0ed7a81ebe80bb178098bca
Author: Siyao Meng <50...@users.noreply.github.com>
AuthorDate: Mon Oct 26 10:40:21 2026 -0700
HDFS-18011. DataTransferSaslUtil.getPeerAddress fails on IPv6 peer addresses (#8851)
Co-authored-by: Claude Opus 5.5 <no...@anthropic.com>
---
.../datatransfer/sasl/DataTransferSaslUtil.java | 17 ++++++++++----
.../datatransfer/sasl/TestSaslDataTransfer.java | 27 ++++++++++++++++++++++
2 files changed, 39 insertions(+), 5 deletions(-)
diff --git a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/sasl/DataTransferSaslUtil.java b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/sasl/DataTransferSaslUtil.java
index 97607699ccd..53b675a73dc 100644
--- a/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/sasl/DataTransferSaslUtil.java
+++ b/hadoop-hdfs-project/hadoop-hdfs-client/src/main/java/org/apache/hadoop/hdfs/protocol/datatransfer/sasl/DataTransferSaslUtil.java
@@ -160,15 +160,22 @@ public static char[] encryptionKeyToPassword(byte[] encryptionKey) {
* Returns InetAddress from peer. The getRemoteAddressString has the form
* [host][/ip-address]:port. The host may be missing. The IP address (and
* preceding '/') may be missing. The port preceded by ':' is always present.
+ * An IPv6 address may be enclosed in brackets.
*
* @return InetAddress from peer
*/
public static InetAddress getPeerAddress(Peer peer) {
- String remoteAddr = peer.getRemoteAddressString().split(":")[0];
- int slashIdx = remoteAddr.indexOf('/');
- return InetAddresses.forString(slashIdx != -1 ?
- remoteAddr.substring(slashIdx + 1, remoteAddr.length()) :
- remoteAddr);
+ String remoteAddr = peer.getRemoteAddressString();
+ // The port follows the last ':', IPv6 addresses contain ':' themselves.
+ int colonIdx = remoteAddr.lastIndexOf(':');
+ if (colonIdx != -1) {
+ remoteAddr = remoteAddr.substring(0, colonIdx);
+ }
+ remoteAddr = remoteAddr.substring(remoteAddr.indexOf('/') + 1);
+ if (remoteAddr.startsWith("[") && remoteAddr.endsWith("]")) {
+ remoteAddr = remoteAddr.substring(1, remoteAddr.length() - 1);
+ }
+ return InetAddresses.forString(remoteAddr);
}
/**
diff --git a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/sasl/TestSaslDataTransfer.java b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/sasl/TestSaslDataTransfer.java
index 76bc1532c6b..a6a0e61bd7a 100644
--- a/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/sasl/TestSaslDataTransfer.java
+++ b/hadoop-hdfs-project/hadoop-hdfs/src/test/java/org/apache/hadoop/hdfs/protocol/datatransfer/sasl/TestSaslDataTransfer.java
@@ -32,6 +32,7 @@
import java.io.IOException;
import java.net.InetAddress;
+import java.net.InetSocketAddress;
import java.net.ServerSocket;
import java.net.Socket;
import java.net.SocketTimeoutException;
@@ -405,4 +406,30 @@ public boolean isTrusted(InetAddress peerAddress) {
}
}
+ @Test
+ public void testGetPeerAddress() throws Exception {
+ for (String ip : new String[] {"192.168.1.10", "fd00:dead:beef::21", "::1"}) {
+ InetAddress addr = InetAddress.getByName(ip);
+ assertPeerAddress(addr, new InetSocketAddress(addr, 9866).toString());
+ assertPeerAddress(addr, new InetSocketAddress(
+ InetAddress.getByAddress("dn1.example.com", addr.getAddress()), 9866).toString());
+ }
+ InetAddress loopback6 = InetAddress.getByName("::1");
+ // Unbracketed IPv6 form, as printed by InetSocketAddress before JDK 14
+ assertPeerAddress(loopback6, "/0:0:0:0:0:0:0:1:9866");
+ assertPeerAddress(loopback6, "[::1]:9866");
+ assertPeerAddress(InetAddress.getByName("192.168.1.10"), "192.168.1.10:9866");
+ assertThrows(IllegalArgumentException.class, () -> getPeerAddress("dn1.example.com:9866"));
+ }
+
+ private static void assertPeerAddress(InetAddress expected, String remoteAddress) {
+ assertEquals(expected, getPeerAddress(remoteAddress), remoteAddress);
+ }
+
+ private static InetAddress getPeerAddress(String remoteAddress) {
+ Peer peer = mock(Peer.class);
+ Mockito.when(peer.getRemoteAddressString()).thenReturn(remoteAddress);
+ return DataTransferSaslUtil.getPeerAddress(peer);
+ }
+
}
---------------------------------------------------------------------
To unsubscribe, e-mail: common-commits-unsubscribe@hadoop.apache.org
For additional commands, e-mail: common-commits-help@hadoop.apache.org