From b27e84d32e2fb507eae7a546aa3d3e0d5d562423 Mon Sep 17 00:00:00 2001 From: coffeys Date: Tue, 1 Sep 2015 09:37:34 -0700 Subject: [PATCH] 8133196: HTTPS hostname invalid issue with InetAddress Reviewed-by: chegar, xuelei --- src/share/classes/java/net/Inet4Address.java | 2 + src/share/classes/java/net/InetAddress.java | 2 +- src/share/native/java/net/InetAddress.c | 3 + src/share/native/java/net/net_util.c | 1 + src/share/native/java/net/net_util.h | 1 + .../net/InetAddress/getOriginalHostName.java | 71 +++++++++++++++++++ 6 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 test/java/net/InetAddress/getOriginalHostName.java diff --git a/src/share/classes/java/net/Inet4Address.java b/src/share/classes/java/net/Inet4Address.java index 528b27674..34b104690 100644 --- a/src/share/classes/java/net/Inet4Address.java +++ b/src/share/classes/java/net/Inet4Address.java @@ -117,11 +117,13 @@ class Inet4Address extends InetAddress { holder().address = address; } } + holder().originalHostName = hostName; } Inet4Address(String hostName, int address) { holder().hostName = hostName; holder().family = IPv4; holder().address = address; + holder().originalHostName = hostName; } /** diff --git a/src/share/classes/java/net/InetAddress.java b/src/share/classes/java/net/InetAddress.java index e7809b54a..3d0f65b63 100644 --- a/src/share/classes/java/net/InetAddress.java +++ b/src/share/classes/java/net/InetAddress.java @@ -217,7 +217,7 @@ class InetAddress implements java.io.Serializable { * * Note: May define a new public method in the future if necessary. */ - private String originalHostName; + String originalHostName; InetAddressHolder() {} diff --git a/src/share/native/java/net/InetAddress.c b/src/share/native/java/net/InetAddress.c index f5a0fc00d..607ed356b 100644 --- a/src/share/native/java/net/InetAddress.c +++ b/src/share/native/java/net/InetAddress.c @@ -38,6 +38,7 @@ jfieldID ia_holderID; jfieldID iac_addressID; jfieldID iac_familyID; jfieldID iac_hostNameID; +jfieldID iac_origHostNameID; jfieldID ia_preferIPv6AddressID; /* @@ -64,4 +65,6 @@ Java_java_net_InetAddress_init(JNIEnv *env, jclass cls) { iac_familyID = (*env)->GetFieldID(env, iac_class, "family", "I"); CHECK_NULL(iac_familyID); iac_hostNameID = (*env)->GetFieldID(env, iac_class, "hostName", "Ljava/lang/String;"); + CHECK_NULL(iac_hostNameID); + iac_origHostNameID = (*env)->GetFieldID(env, iac_class, "originalHostName", "Ljava/lang/String;"); } diff --git a/src/share/native/java/net/net_util.c b/src/share/native/java/net/net_util.c index f8a0e90b5..56edb6340 100644 --- a/src/share/native/java/net/net_util.c +++ b/src/share/native/java/net/net_util.c @@ -199,6 +199,7 @@ void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject host) { initInetAddrs(env); holder = (*env)->GetObjectField(env, iaObj, ia_holderID); (*env)->SetObjectField(env, holder, iac_hostNameID, host); + (*env)->SetObjectField(env, holder, iac_origHostNameID, host); } int getInetAddress_addr(JNIEnv *env, jobject iaObj) { diff --git a/src/share/native/java/net/net_util.h b/src/share/native/java/net/net_util.h index 60d63fcb6..9063c3e8d 100644 --- a/src/share/native/java/net/net_util.h +++ b/src/share/native/java/net/net_util.h @@ -53,6 +53,7 @@ extern jclass ia_class; extern jfieldID iac_addressID; extern jfieldID iac_familyID; extern jfieldID iac_hostNameID; +extern jfieldID iac_origHostNameID; extern jfieldID ia_preferIPv6AddressID; /** (Inet6Address accessors) diff --git a/test/java/net/InetAddress/getOriginalHostName.java b/test/java/net/InetAddress/getOriginalHostName.java new file mode 100644 index 000000000..0c22bc8c8 --- /dev/null +++ b/test/java/net/InetAddress/getOriginalHostName.java @@ -0,0 +1,71 @@ +/* + * Copyright (c) 2015, Oracle and/or its affiliates. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/* + * @test + * @bug 8133196 + * @summary test functionality of getOriginalHostName(InetAddress) + */ + +import java.io.*; +import java.net.InetAddress; + +import sun.misc.JavaNetAccess; +import sun.misc.SharedSecrets; + +public class getOriginalHostName { + + private static final JavaNetAccess jna = SharedSecrets.getJavaNetAccess(); + + public static void main(String[] args) throws Exception { + final String HOST = "dummyserver.java.net"; + InetAddress ia = null; + ia = InetAddress.getByName(HOST); + testInetAddress(ia, HOST); + ia = InetAddress.getByName("255.255.255.0"); + testInetAddress(ia, null); + ia = InetAddress.getByAddress(new byte[]{1,1,1,1}); + testInetAddress(ia, null); + ia = InetAddress.getLocalHost(); + testInetAddress(ia, ia.getHostName()); + ia = InetAddress.getLoopbackAddress(); + testInetAddress(ia, ia.getHostName()); + } + + + private static void testInetAddress(InetAddress ia, String expected) + throws Exception { + + System.out.println("Testing InetAddress: " + ia); + System.out.println("Expecting original hostname of : " + expected); + String origHostName = jna.getOriginalHostName(ia); + System.out.println("via JavaNetAccess: " + origHostName); + if (origHostName == null && expected != null) { + throw new RuntimeException("Unexpected null. Testing:" + expected); + } else if (expected != null && !origHostName.equals(expected)) { + throw new RuntimeException("Unexpected hostname :" + origHostName); + } else if (expected == null && origHostName != null) { + throw new RuntimeException("Unexpected origHostName: " + origHostName); + } + } +} -- GitLab