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