# HG changeset patch # User coffeys # Date 1441127527 -3600 # Node ID 9ee33abf5b4cc508e3b65f219648051a6c1eda1e # Parent bb014fdf246bd125d08a0e93c9471de980268977 8133196: HTTPS hostname invalid issue with InetAddress Reviewed-by: chegar, xuelei diff -r bb014fdf246b -r 9ee33abf5b4c jdk/src/java.base/share/classes/java/net/Inet4Address.java --- a/jdk/src/java.base/share/classes/java/net/Inet4Address.java Thu Aug 06 10:13:46 2015 -0700 +++ b/jdk/src/java.base/share/classes/java/net/Inet4Address.java Tue Sep 01 18:12:07 2015 +0100 @@ -117,11 +117,13 @@ holder().address = address; } } + holder().originalHostName = hostName; } Inet4Address(String hostName, int address) { holder().hostName = hostName; holder().family = IPv4; holder().address = address; + holder().originalHostName = hostName; } /** diff -r bb014fdf246b -r 9ee33abf5b4c jdk/src/java.base/share/classes/java/net/InetAddress.java --- a/jdk/src/java.base/share/classes/java/net/InetAddress.java Thu Aug 06 10:13:46 2015 -0700 +++ b/jdk/src/java.base/share/classes/java/net/InetAddress.java Tue Sep 01 18:12:07 2015 +0100 @@ -221,7 +221,7 @@ * * Note: May define a new public method in the future if necessary. */ - private String originalHostName; + String originalHostName; InetAddressHolder() {} diff -r bb014fdf246b -r 9ee33abf5b4c jdk/src/java.base/share/native/libnet/InetAddress.c --- a/jdk/src/java.base/share/native/libnet/InetAddress.c Thu Aug 06 10:13:46 2015 -0700 +++ b/jdk/src/java.base/share/native/libnet/InetAddress.c Tue Sep 01 18:12:07 2015 +0100 @@ -38,6 +38,7 @@ jfieldID iac_addressID; jfieldID iac_familyID; jfieldID iac_hostNameID; +jfieldID iac_origHostNameID; jfieldID ia_preferIPv6AddressID; static int ia_initialized = 0; @@ -69,6 +70,8 @@ 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;"); + CHECK_NULL(iac_origHostNameID); ia_initialized = 1; } } diff -r bb014fdf246b -r 9ee33abf5b4c jdk/src/java.base/share/native/libnet/net_util.c --- a/jdk/src/java.base/share/native/libnet/net_util.c Thu Aug 06 10:13:46 2015 -0700 +++ b/jdk/src/java.base/share/native/libnet/net_util.c Tue Sep 01 18:12:07 2015 +0100 @@ -174,6 +174,7 @@ void setInetAddress_hostName(JNIEnv *env, jobject iaObj, jobject host) { jobject 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 -r bb014fdf246b -r 9ee33abf5b4c jdk/src/java.base/share/native/libnet/net_util.h --- a/jdk/src/java.base/share/native/libnet/net_util.h Thu Aug 06 10:13:46 2015 -0700 +++ b/jdk/src/java.base/share/native/libnet/net_util.h Tue Sep 01 18:12:07 2015 +0100 @@ -53,6 +53,7 @@ extern jfieldID iac_addressID; extern jfieldID iac_familyID; extern jfieldID iac_hostNameID; +extern jfieldID iac_origHostNameID; extern jfieldID ia_preferIPv6AddressID; JNIEXPORT void JNICALL initInetAddressIDs(JNIEnv *env); diff -r bb014fdf246b -r 9ee33abf5b4c jdk/test/java/net/InetAddress/getOriginalHostName.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/test/java/net/InetAddress/getOriginalHostName.java Tue Sep 01 18:12:07 2015 +0100 @@ -0,0 +1,73 @@ +/* + * 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) + * @modules java.base/sun.misc + */ + +import java.io.*; +import java.net.InetAddress; + +import sun.misc.JavaNetInetAddressAccess; +import sun.misc.SharedSecrets; + +public class getOriginalHostName { + + private static final JavaNetInetAddressAccess jna = + SharedSecrets.getJavaNetInetAddressAccess(); + + 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); + } + } +}