From owner-svn-ports-head@FreeBSD.ORG Sat Jan 24 00:02:02 2015 Return-Path: Delivered-To: svn-ports-head@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 100F27C5; Sat, 24 Jan 2015 00:02:02 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id EEC2F8F0; Sat, 24 Jan 2015 00:02:01 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id t0O021xp091638; Sat, 24 Jan 2015 00:02:01 GMT (envelope-from jkim@FreeBSD.org) Received: (from jkim@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id t0O021mr091624; Sat, 24 Jan 2015 00:02:01 GMT (envelope-from jkim@FreeBSD.org) Message-Id: <201501240002.t0O021mr091624@svn.freebsd.org> X-Authentication-Warning: svn.freebsd.org: jkim set sender to jkim@FreeBSD.org using -f From: Jung-uk Kim Date: Sat, 24 Jan 2015 00:02:01 +0000 (UTC) To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r377775 - in head/java: openjdk6 openjdk6-jre openjdk6/files X-SVN-Group: ports-head MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-ports-head@freebsd.org X-Mailman-Version: 2.1.18-1 Precedence: list List-Id: SVN commit messages for the ports tree for head List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 24 Jan 2015 00:02:02 -0000 Author: jkim Date: Sat Jan 24 00:02:00 2015 New Revision: 377775 URL: https://svnweb.freebsd.org/changeset/ports/377775 QAT: https://qat.redports.org/buildarchive/r377775/ Log: Update to b34. Deleted: head/java/openjdk6/files/patch-TimeZoneNames head/java/openjdk6/files/patch-jdk_src_share_classes_java_util_CurrencyData.properties Modified: head/java/openjdk6-jre/Makefile head/java/openjdk6/Makefile head/java/openjdk6/distinfo head/java/openjdk6/files/patch-set Modified: head/java/openjdk6-jre/Makefile ============================================================================== --- head/java/openjdk6-jre/Makefile Fri Jan 23 23:45:46 2015 (r377774) +++ head/java/openjdk6-jre/Makefile Sat Jan 24 00:02:00 2015 (r377775) @@ -1,6 +1,5 @@ # $FreeBSD$ -PORTREVISION= 0 CATEGORIES= java devel PKGNAMESUFFIX= -jre Modified: head/java/openjdk6/Makefile ============================================================================== --- head/java/openjdk6/Makefile Fri Jan 23 23:45:46 2015 (r377774) +++ head/java/openjdk6/Makefile Sat Jan 24 00:02:00 2015 (r377775) @@ -2,8 +2,8 @@ # $FreeBSD$ PORTNAME= openjdk6 -PORTVERSION= b33 -PORTREVISION?= 0 +PORTVERSION= b34 +PORTREVISION= 0 PORTEPOCH= 1 CATEGORIES= java devel MASTER_SITES= ${MASTER_SITE_APACHE:S,%SUBDIR%/,ant/binaries/:ant,} \ @@ -30,7 +30,7 @@ LIB_DEPENDS= libfreetype.so:${PORTSDIR}/ RUN_DEPENDS= javavm:${PORTSDIR}/java/javavmwrapper \ ${LOCALBASE}/lib/X11/fonts/dejavu:${PORTSDIR}/x11-fonts/dejavu -OPENJDK_BUILDDATE= 14_oct_2014 +OPENJDK_BUILDDATE= 20_jan_2015 OPTIONS_DEFINE= ICEDTEA IPV6 POLICY SOUND TZUPDATE OPTIONS_DEFAULT=ICEDTEA IPV6 TZUPDATE @@ -142,6 +142,10 @@ MAKE_ENV+= SKIP_FASTDEBUG_BUILD=true MAKE_ENV+= DONT_ENABLE_IPV6="YES" .endif +.if ${PORT_OPTIONS:MPOLICY} +MAKE_ENV+= UNLIMITED_CRYPTO="YES" +.endif + .if ${PORT_OPTIONS:MSOUND} EXTRA_PATCHES+= ${FILESDIR}/alsa-enable.patch LIB_DEPENDS+= libasound.so:${PORTSDIR}/audio/alsa-lib @@ -248,13 +252,6 @@ post-patch: ${WRKSRC}/hotspot/src/os/bsd/vm/os_bsd.cpp \ ${WRKSRC}/jdk/src/share/classes/com/sun/java/swing/plaf/gtk/Metacity.java \ ${WRKSRC}/jdk/src/share/classes/sun/print/PSPrinterJob.java -.if ${PORT_OPTIONS:MPOLICY} - @${REINPLACE_CMD} -e 's|%%POLICY%%|unlimited|' \ - ${WRKSRC}/jdk/make/javax/crypto/Makefile -.else - @${REINPLACE_CMD} -e 's|%%POLICY%%|limited|' \ - ${WRKSRC}/jdk/make/javax/crypto/Makefile -.endif .if defined(BUILD_JRE) @${REINPLACE_CMD} -e "s|%%JAVA_HOME%%|${PREFIX}/openjdk6-jre|" \ ${WRKSRC}/hotspot/src/os/posix/launcher/java_md.c \ Modified: head/java/openjdk6/distinfo ============================================================================== --- head/java/openjdk6/distinfo Fri Jan 23 23:45:46 2015 (r377774) +++ head/java/openjdk6/distinfo Sat Jan 24 00:02:00 2015 (r377775) @@ -1,6 +1,6 @@ SHA256 (apache-ant-1.9.4-bin.tar.bz2) = 20c16575684b8869dd9d19abe0fb504566adefb5d397881e70a417886e0088cf SIZE (apache-ant-1.9.4-bin.tar.bz2) = 4351965 -SHA256 (openjdk-6-src-b33-14_oct_2014.tar.xz) = cabc35587a90fa81edd8ba8537c0454348c37456de27e407bbb66d52031a1293 -SIZE (openjdk-6-src-b33-14_oct_2014.tar.xz) = 33476800 +SHA256 (openjdk-6-src-b34-20_jan_2015.tar.xz) = 13d1b4e1e152b6f9ad81b5558d6c7c0d3315a9e9494e49e515229722e2ee4e51 +SIZE (openjdk-6-src-b34-20_jan_2015.tar.xz) = 33601316 SHA256 (jtreg-4.1-bin-b05_29_nov_2012.zip) = 9291eb4a14501232b35614e88686ff66ad8b69d0098dbd4322b28f97b672653d SIZE (jtreg-4.1-bin-b05_29_nov_2012.zip) = 5993382 Modified: head/java/openjdk6/files/patch-set ============================================================================== --- head/java/openjdk6/files/patch-set Fri Jan 23 23:45:46 2015 (r377774) +++ head/java/openjdk6/files/patch-set Sat Jan 24 00:02:00 2015 (r377775) @@ -1797,6 +1797,84 @@ static int pthread_getcpuclockid(pthread_t tid, clockid_t *clock_id) { return _pthread_getcpuclockid ? _pthread_getcpuclockid(tid, clock_id) : -1; } +--- hotspot/src/os/bsd/vm/perfMemory_bsd.cpp ++++ hotspot/src/os/bsd/vm/perfMemory_bsd.cpp +@@ -303,7 +303,6 @@ + DIR *dirp = NULL; + RESTARTABLE(::open(dirname, O_RDONLY|O_NOFOLLOW), result); + if (result == OS_ERR) { +- // Directory doesn't exist or is a symlink, so there is nothing to cleanup. + if (PrintMiscellaneous && Verbose) { + if (errno == ELOOP) { + warning("directory %s is a symlink and is not secure\n", dirname); +@@ -420,6 +419,7 @@ + return true; + } + ++ + // return the user name for the given user id + // + // the caller is expected to free the allocated memory. +@@ -542,6 +542,18 @@ + continue; + } + ++ // Since we don't create the backing store files in directories ++ // pointed to by symbolic links, we also don't follow them when ++ // looking for the files. We check for a symbolic link after the ++ // call to opendir in order to eliminate a small window where the ++ // symlink can be exploited. ++ // ++ if (!is_directory_secure(usrdir_name)) { ++ FREE_C_HEAP_ARRAY(char, usrdir_name); ++ os::closedir(subdirp); ++ continue; ++ } ++ + struct dirent* udentry; + char* udbuf = NEW_C_HEAP_ARRAY(char, os::readdir_buf_size(usrdir_name)); + errno = 0; +@@ -643,6 +655,7 @@ + } + } + ++ + // cleanup stale shared memory resources + // + // This method attempts to remove all stale shared memory files in +@@ -655,7 +668,7 @@ + static void cleanup_sharedmem_resources(const char* dirname) { + + int saved_cwd_fd; +- // open the directory and set the current working directory to it ++ // open the directory + DIR* dirp = open_directory_secure_cwd(dirname, &saved_cwd_fd); + if (dirp == NULL) { + // directory doesn't exist or is insecure, so there is nothing to cleanup +@@ -681,7 +694,6 @@ + if (pid == 0) { + + if (strcmp(entry->d_name, ".") != 0 && strcmp(entry->d_name, "..") != 0) { +- + // attempt to remove all unexpected files, except "." and ".." + unlink(entry->d_name); + } +@@ -705,7 +717,6 @@ + // + if ((pid == os::current_process_id()) || + (kill(pid, 0) == OS_ERR && (errno == ESRCH || errno == EPERM))) { +- + unlink(entry->d_name); + } + errno = 0; +@@ -914,7 +925,6 @@ + + char* dirname = get_user_tmp_dir(user_name); + char* filename = get_sharedmem_filename(dirname, vmid); +- + // get the short filename + char* short_filename = strrchr(filename, '/'); + if (short_filename == NULL) { --- hotspot/src/os/bsd/vm/threadCritical_bsd.cpp +++ hotspot/src/os/bsd/vm/threadCritical_bsd.cpp @@ -33,35 +33,36 @@ @@ -4331,17 +4409,6 @@ OTHER_LDLIBS = $(JVMLIB) +endif + ---- jdk/make/javax/crypto/Makefile -+++ jdk/make/javax/crypto/Makefile -@@ -155,7 +155,7 @@ - # - - ifdef OPENJDK --all: build-jar install-jar build-policy install-limited -+all: build-jar install-jar build-policy install-%%POLICY%% - else # OPENJDK - ifeq ($(strip $(FILES_java)),) - all: --- jdk/make/javax/sound/FILES_c.gmk +++ jdk/make/javax/sound/FILES_c.gmk @@ -34,6 +34,8 @@ @@ -12036,10 +12103,10 @@ } --- jdk/src/solaris/native/java/net/NetworkInterface.c +++ jdk/src/solaris/native/java/net/NetworkInterface.c -@@ -23,13 +23,13 @@ - * questions. +@@ -24,13 +24,13 @@ */ + +#include +#include #include @@ -12052,11 +12119,11 @@ #include #include #include -@@ -47,6 +47,19 @@ - #else +@@ -41,6 +41,19 @@ + #include #include #endif -+#if defined(_ALLBSD_SOURCE) ++#ifdef _ALLBSD_SOURCE +#include +#include +#if defined(__FreeBSD__) || defined(__APPLE__) @@ -12071,247 +12138,267 @@ +#endif #ifdef __linux__ - #define ifr_index ifr_ifindex -@@ -577,6 +590,7 @@ - } + #include +@@ -133,8 +146,9 @@ -+#if !defined(_ALLBSD_SOURCE) - /* - * Enumerates and returns all IPv4 interfaces - */ -@@ -687,6 +701,176 @@ - return ifs; + +-#ifdef __solaris__ ++#if defined(_ALLBSD_SOURCE) || defined(__solaris__) + static netif *enumIPvXInterfaces(JNIEnv *env, int sock, netif *ifs, int family); ++#ifdef __solaris__ + static int getMacFromDevice(JNIEnv *env, const char* ifname, unsigned char* retbuf); + + #ifndef SIOCGLIFHWADDR +@@ -142,6 +156,7 @@ + #endif + + #endif ++#endif + + /******************* Java entry points *****************************/ + +@@ -995,6 +1010,240 @@ } -+#else /* _ALLBSD_SOURCE */ -+ -+/* -+ * Enumerates and returns all IPv4 interfaces -+ * -+ * WARNING! Make sure that it's correctly synchronized on future JDK -+ * versions imports! + ++/** BSD **/ ++#ifdef _ALLBSD_SOURCE ++/* Open socket for further ioct calls, try v4 socket first and ++ * if it falls return v6 socket + */ -+static netif *enumIPv4Interfaces(JNIEnv *env, netif *ifs) -+{ ++ ++#ifdef AF_INET6 ++// unused arg ifname and struct if2 ++static int openSocketWithFallback(JNIEnv *env, const char *ifname){ + int sock; -+ struct ifaddrs *ifa, *origifa; ++ struct ifreq if2; + -+ sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0); -+ if (sock < 0) { -+ /* -+ * If EPROTONOSUPPORT is returned it means we don't have -+ * IPv4 support so don't throw an exception. -+ */ -+ if (errno != EPROTONOSUPPORT) { -+ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", -+ "Socket creation failed"); -+ } -+ return ifs; ++ if ((sock = JVM_Socket(AF_INET, SOCK_DGRAM, 0)) < 0) { ++ if (errno == EPROTONOSUPPORT){ ++ if ( (sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0)) < 0 ){ ++ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV6 Socket creation failed"); ++ return -1; ++ } ++ } ++ else{ // errno is not NOSUPPORT ++ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", "IPV4 Socket creation failed"); ++ return -1; ++ } + } + -+ if (getifaddrs(&origifa) != 0) { -+ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", -+ "getifaddrs() function failed"); -+ close(sock); -+ return ifs; -+ } ++ return sock; ++} + -+ for (ifa = origifa; ifa != NULL; ifa = ifa->ifa_next) { ++#else ++static int openSocketWithFallback(JNIEnv *env, const char *ifname){ ++ return openSocket(env, AF_INET); ++} ++#endif + -+ /* -+ * Skip non-AF_INET entries. -+ */ -+ if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET) -+ continue; ++static netif *enumIPv4Interfaces(JNIEnv *env, int sock, netif *ifs) { ++ return enumIPvXInterfaces(env, sock, ifs, AF_INET); ++} + -+ /* -+ * Add to the list. -+ * -+ * BSDNOTE: in order to optimize code, interface index detection -+ * logic was added directly to addif(). -+ */ -+ ifs = addif(env, ifs, ifa->ifa_name, (-1), AF_INET, -+ ifa->ifa_addr, sizeof(struct sockaddr_in), 0); ++#ifdef AF_INET6 ++static netif *enumIPv6Interfaces(JNIEnv *env, int sock, netif *ifs) { ++ return enumIPvXInterfaces(env, sock, ifs, AF_INET6); ++} ++#endif + -+ /* -+ * If an exception occurred then free the list. -+ */ -+ if ((*env)->ExceptionOccurred(env)) { -+ close(sock); -+ freeifaddrs(origifa); -+ freeif(ifs); -+ return NULL; -+ } ++/* ++ Enumerates and returns all interfaces on BSD ++ use the same code for IPv4 and IPv6 ++ */ ++static netif *enumIPvXInterfaces(JNIEnv *env, int sock, netif *ifs, int family) { ++ struct ifaddrs *ifa0, *ifa; ++ ++ /* ++ * Grab the interface list ++ */ ++ if (getifaddrs(&ifa0) < 0) { ++ return NULL; + } + + /* -+ * Free socket and buffer ++ * Iterate through each interface + */ -+ close(sock); -+ freeifaddrs(origifa); ++ for (ifa = ifa0; ifa != NULL; ifa = ifa->ifa_next) { ++ if (ifa->ifa_addr->sa_family == family) { ++ /* ++ * Add to the list ++ */ ++ ifs = addif(env, sock, ifa->ifa_name, ifs, ifa->ifa_addr, family, 0); ++ ++ /* ++ * If an exception occurred then free the list ++ */ ++ if ((*env)->ExceptionOccurred(env)) { ++ freeif(ifs); ++ ifs = NULL; ++ break; ++ } ++ } ++ } ++ freeifaddrs(ifa0); ++ + return ifs; +} + -+#if defined(AF_INET6) -+/* -+ * Determines the prefix on BSD for IPv6 interfaces. ++static int getIndex(int sock, const char *name){ ++ /* ++ * Try to get the interface index ++ */ ++ struct ifreq if2; ++ strcpy(if2.ifr_name, name); ++ ++ if (ioctl(sock, SIOCGIFINDEX, (char *)&if2) < 0) { ++ return -1; ++ } ++ ++ return if2.ifr_index; ++} ++ ++/** ++ * Returns the IPv4 broadcast address of a named interface, if it exists. ++ * Returns 0 if it doesn't have one. + */ -+static -+int prefix(void *val, int size) { -+ u_char *name = (u_char *)val; -+ int byte, bit, plen = 0; -+ -+ for (byte = 0; byte < size; byte++, plen += 8) -+ if (name[byte] != 0xff) -+ break; -+ if (byte == size) -+ return (plen); -+ for (bit = 7; bit != 0; bit--, plen++) -+ if (!(name[byte] & (1 << bit))) -+ break; -+ for (; bit != 0; bit--) -+ if (name[byte] & (1 << bit)) -+ return (0); -+ byte++; -+ for (; byte < size; byte++) -+ if (name[byte]) -+ return (0); -+ return (plen); ++static struct sockaddr *getBroadcast(JNIEnv *env, int sock, const char *ifname, struct sockaddr *brdcast_store) { ++ struct sockaddr *ret = NULL; ++ struct ifreq if2; ++ ++ memset((char *) &if2, 0, sizeof(if2)); ++ strcpy(if2.ifr_name, ifname); ++ ++ /* Let's make sure the interface does have a broadcast address */ ++ if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) < 0) { ++ NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFFLAGS failed"); ++ return ret; ++ } ++ ++ if (if2.ifr_flags & IFF_BROADCAST) { ++ /* It does, let's retrieve it*/ ++ if (ioctl(sock, SIOCGIFBRDADDR, (char *)&if2) < 0) { ++ NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFBRDADDR failed"); ++ return ret; ++ } ++ ++ ret = brdcast_store; ++ memcpy(ret, &if2.ifr_broadaddr, sizeof(struct sockaddr)); ++ } ++ ++ return ret; +} + -+/* -+ * Enumerates and returns all IPv6 interfaces on FreeBSD -+ * -+ * BSDNOTE: it's done in same as IPv4 enumeration and should be carefully -+ * reviewed with each JDK update (according to Solaris/Linux version) ++/** ++ * Returns the IPv4 subnet prefix length (aka subnet mask) for the named ++ * interface, if it has one, otherwise return -1. + */ -+static netif *enumIPv6Interfaces(JNIEnv *env, netif *ifs) { ++static short getSubnet(JNIEnv *env, int sock, const char *ifname) { ++ unsigned int mask; ++ short ret; ++ struct ifreq if2; + -+ int sock; -+ struct ifaddrs *ifa, *origifa; -+ struct sockaddr_in6 *sin6; -+ struct in6_ifreq ifr6; -+ -+ // Open IPv6 UDP socket. -+ sock = JVM_Socket(AF_INET6, SOCK_DGRAM, 0); -+ if (sock < 0) { -+ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", -+ "Failed to create IPv6 socket"); -+ return ifs; -+ } -+ -+ if (getifaddrs(&origifa) != 0) { -+ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", -+ "getifaddrs() function failed"); -+ close(sock); -+ return ifs; -+ } ++ memset((char *) &if2, 0, sizeof(if2)); ++ strcpy(if2.ifr_name, ifname); + -+ for (ifa = origifa; ifa != NULL; ifa = ifa->ifa_next) { ++ if (ioctl(sock, SIOCGIFNETMASK, (char *)&if2) < 0) { ++ NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFNETMASK failed"); ++ return -1; ++ } + -+ /* -+ * Skip non-AF_INET6 entries. -+ */ -+ if (ifa->ifa_addr == NULL || ifa->ifa_addr->sa_family != AF_INET6) -+ continue; ++ mask = ntohl(((struct sockaddr_in*)&(if2.ifr_addr))->sin_addr.s_addr); ++ ret = 0; ++ while (mask) { ++ mask <<= 1; ++ ret++; ++ } + -+ memset(&ifr6, 0, sizeof(ifr6)); -+ strlcpy(ifr6.ifr_name, ifa->ifa_name, sizeof(ifr6.ifr_name)); -+ memcpy(&ifr6.ifr_addr, ifa->ifa_addr, MIN(sizeof(ifr6.ifr_addr), ifa->ifa_addr->sa_len)); -+ -+ if (ioctl(sock, SIOCGIFNETMASK_IN6, (caddr_t)&ifr6) < 0) { -+ NET_ThrowByNameWithLastError(env , JNU_JAVANETPKG "SocketException", -+ "ioctl SIOCGIFNETMASK_IN6 failed"); -+ close(sock); -+ freeifaddrs(origifa); -+ freeif(ifs); -+ return NULL; -+ } ++ return ret; ++} + -+ /* Add to the list. */ -+ sin6 = (struct sockaddr_in6 *)&ifr6.ifr_addr; -+ ifs = addif(env, ifs, ifa->ifa_name, (-1), AF_INET6, -+ ifa->ifa_addr, sizeof(struct sockaddr_in6), -+ prefix(&sin6->sin6_addr, sizeof(struct in6_addr))); -+ -+ /* If an exception occurred then free the list. */ -+ if ((*env)->ExceptionOccurred(env)) { -+ close(sock); -+ freeifaddrs(origifa); -+ freeif(ifs); -+ return NULL; -+ } ++/** ++ * Get the Hardware address (usually MAC address) for the named interface. ++ * return puts the data in buf, and returns the length, in byte, of the ++ * MAC address. Returns -1 if there is no hardware address on that interface. ++ */ ++static int getMacAddress(JNIEnv *env, int sock, const char* ifname, const struct in_addr* addr, unsigned char *buf) { ++ struct ifaddrs *ifa0, *ifa; ++ struct sockaddr *saddr; ++ struct sockaddr_dl *sadl; ++ int ret = -1; ++ ++ /* ++ * Grab the interface list ++ */ ++ if (getifaddrs(&ifa0) < 0) { ++ return ret; + } + + /* -+ * Free socket and ifaddrs buffer ++ * Iterate through each interface + */ -+ close(sock); -+ freeifaddrs(origifa); -+ return ifs; -+} -+#endif /* AF_INET6 */ ++ for (ifa = ifa0; ifa != NULL; ifa = ifa->ifa_next) { ++ saddr = ifa->ifa_addr; + -+#endif /* !_ALLBSD_SOURCE */ - - #if defined(__solaris__) && defined(AF_INET6) - /* -@@ -1007,7 +1191,13 @@ - JNU_ThrowOutOfMemoryError(env, "heap allocation failed"); - return ifs; - } -+#if defined(_ALLBSD_SOURCE) -+ currif->index = if_nametoindex(name); -+ if (currif->index == 0) -+ currif->index = -1; -+#else - currif->index = index; -+#endif - currif->addr = NULL; - currif->childs = NULL; - currif->virtual = isVirtual; -@@ -1295,6 +1485,31 @@ - * All bytes to 0 means no hardware address. - */ - return -1; -+#elif defined(_ALLBSD_SOURCE) -+ struct ifaddrs *ifa0, *ifa; -+ struct sockaddr *saddr; -+ int i; -+ -+ /* Grab the interface list */ -+ if (!getifaddrs(&ifa0)) { -+ /* Cycle through the interfaces */ -+ for (i = 0, ifa = ifa0; ifa != NULL; ifa = ifa->ifa_next, i++) { -+ saddr = ifa->ifa_addr; -+ /* Link layer contains the MAC address */ -+ if (saddr->sa_family == AF_LINK && !strcmp(ifname, ifa->ifa_name)) { -+ struct sockaddr_dl *sadl = (struct sockaddr_dl *) saddr; -+ /* Check the address is the correct length */ -+ if (sadl->sdl_alen == ETHER_ADDR_LEN) { -+ memcpy(buf, (sadl->sdl_data + sadl->sdl_nlen), ETHER_ADDR_LEN); -+ freeifaddrs(ifa0); -+ return ETHER_ADDR_LEN; ++ /* Link layer contains the MAC address */ ++ if (saddr->sa_family == AF_LINK && strcmp(ifname, ifa->ifa_name) == 0) { ++ sadl = (struct sockaddr_dl *)saddr; ++ ++ /* Check the address is the correct length */ ++ if (sadl->sdl_alen == ETHER_ADDR_LEN) { ++ memcpy(buf, (sadl->sdl_data + sadl->sdl_nlen), ETHER_ADDR_LEN); ++ ret = ETHER_ADDR_LEN; ++ break; ++ } + } -+ } + } + freeifaddrs(ifa0); -+ } + -+ return -1; - #else - struct arpreq arpreq; - struct sockaddr_in* sin; -@@ -1460,7 +1675,7 @@ - "Socket creation failed"); - } else { - --#ifdef __linux__ -+#if defined(__linux__) || defined(_ALLBSD_SOURCE) - memset((char *) &if2, 0, sizeof(if2)); - strcpy(if2.ifr_name, name_utf); - ++ return ret; ++} ++ ++static int getMTU(JNIEnv *env, int sock, const char *ifname) { ++ struct ifreq if2; ++ memset((char *) &if2, 0, sizeof(if2)); ++ ++ if (ifname != NULL) { ++ strcpy(if2.ifr_name, ifname); ++ } else { ++ JNU_ThrowNullPointerException(env, "network interface name is NULL"); ++ return -1; ++ } ++ ++ if (ioctl(sock, SIOCGIFMTU, (char *)&if2) < 0) { ++ NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "IOCTL SIOCGIFMTU failed"); ++ return -1; ++ } ++ ++ return if2.ifr_mtu; ++} ++ ++static int getFlags(int sock, const char *ifname) { ++ struct ifreq if2; ++ int flags; ++ ++ memset((char *) &if2, 0, sizeof(if2)); ++ strcpy(if2.ifr_name, ifname); ++ ++ if (ioctl(sock, SIOCGIFFLAGS, (char *)&if2) < 0) { ++ return -1; ++ } ++ ++ flags = if2.ifr_flags & 0xffff; ++ flags |= if2.ifr_flagshigh << 16; ++ ++ return flags; ++} ++ ++#endif ++ + /** Linux **/ + #ifdef __linux__ + /* Open socket for further ioct calls, try v4 socket first and --- jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c +++ jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c @@ -23,12 +23,12 @@ @@ -12329,7 +12416,7 @@ #ifdef __solaris__ #include -@@ -335,7 +335,7 @@ +@@ -331,7 +331,7 @@ /* The fdObj'fd */ jint fd; @@ -12338,7 +12425,7 @@ SOCKADDR addr; int len; #endif -@@ -345,26 +345,39 @@ +@@ -341,26 +341,39 @@ } fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); @@ -12378,7 +12465,7 @@ // After disconnecting a UDP socket, Linux kernel will set // local port to zero if the port number comes from implicit // bind. Successive send/recv on the same socket will fail. -@@ -387,6 +400,7 @@ +@@ -383,6 +396,7 @@ NET_Bind(fd, (struct sockaddr *)&addr, len); } } @@ -12386,69 +12473,7 @@ #else JVM_Connect(fd, 0, 0); #endif -@@ -1056,31 +1070,38 @@ - Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate(JNIEnv *env, - jobject this) { - jobject fdObj = (*env)->GetObjectField(env, this, pdsi_fdID); -- int fd; -- -- int arg = -1; -- int t = 1; -+ int fd, t = 1; -+#ifdef AF_INET6 -+ int domain = ipv6_available() ? AF_INET6 : AF_INET; -+#else -+ int domain = AF_INET; -+#endif - - if (IS_NULL(fdObj)) { - JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", - "Socket closed"); - return; -- } else { --#ifdef AF_INET6 -- if (ipv6_available()) { -- fd = JVM_Socket(AF_INET6, SOCK_DGRAM, 0); -- } else --#endif /* AF_INET6 */ -- { -- fd = JVM_Socket(AF_INET, SOCK_DGRAM, 0); -- } - } -- if (fd == JVM_IO_ERR) { -+ -+ if ((fd = JVM_Socket(domain, SOCK_DGRAM, 0)) == JVM_IO_ERR) { - NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", - "Error creating socket"); - return; - } - -+#ifdef AF_INET6 -+ /* Disable IPV6_V6ONLY to ensure dual-socket support */ -+ if (domain == AF_INET6) { -+ int arg = 0; -+ if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg, -+ sizeof(int)) < 0) { -+ NET_ThrowNew(env, errno, "cannot set IPPROTO_IPV6"); -+ close(fd); -+ return; -+ } -+ } -+#endif /* AF_INET6 */ -+ - setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*) &t, sizeof(int)); - - #ifdef __linux__ -@@ -1093,7 +1114,7 @@ - * On Linux for IPv6 sockets we must set the hop limit - * to 1 to be compatible with default ttl of 1 for IPv4 sockets. - */ -- if (ipv6_available()) { -+ if (domain == AF_INET6) { - int ttl = 1; - setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl, - sizeof(ttl)); -@@ -1303,7 +1324,7 @@ +@@ -1306,7 +1320,7 @@ /* * value is an InetAddress. */ @@ -12457,7 +12482,7 @@ if (ipv6_available()) { mcast_set_if_by_addr_v6(env, this, fd, value); } else { -@@ -1322,7 +1343,7 @@ +@@ -1325,7 +1339,7 @@ /* * value is a NetworkInterface. */ @@ -12466,7 +12491,7 @@ if (ipv6_available()) { mcast_set_if_by_if_v6(env, this, fd, value); } else { -@@ -1399,7 +1420,7 @@ +@@ -1402,7 +1416,7 @@ */ static void setMulticastLoopbackMode(JNIEnv *env, jobject this, int fd, jint opt, jobject value) { @@ -12475,7 +12500,7 @@ if (ipv6_available()) { mcast_set_loop_v6(env, this, fd, value); } else { -@@ -1964,7 +1985,7 @@ +@@ -1982,7 +1996,7 @@ fd = (*env)->GetIntField(env, fdObj, IO_fd_fdID); } /* setsockopt to be correct ttl */ @@ -12484,7 +12509,7 @@ if (ipv6_available()) { setHopLimit(env, fd, ttl); } else { -@@ -2357,18 +2378,30 @@ +@@ -2374,18 +2388,30 @@ mname6.ipv6mr_interface = idx; } @@ -12520,38 +12545,7 @@ } --- jdk/src/solaris/native/java/net/PlainSocketImpl.c +++ jdk/src/solaris/native/java/net/PlainSocketImpl.c -@@ -253,7 +253,12 @@ - jboolean stream) { - jobject fdObj, ssObj; - int fd; -- int arg = -1; -+ int type = (stream ? SOCK_STREAM : SOCK_DGRAM); -+#ifdef AF_INET6 -+ int domain = ipv6_available() ? AF_INET6 : AF_INET; -+#else -+ int domain = AF_INET; -+#endif - - if (socketExceptionCls == NULL) { - jclass c = (*env)->FindClass(env, "java/net/SocketException"); -@@ -267,25 +272,29 @@ - (*env)->ThrowNew(env, socketExceptionCls, "null fd object"); - return; - } --#ifdef AF_INET6 -- if (ipv6_available()) { -- fd = JVM_Socket(AF_INET6, (stream ? SOCK_STREAM: SOCK_DGRAM), 0); -- } else --#endif /* AF_INET6 */ -- { -- fd = JVM_Socket(AF_INET, (stream ? SOCK_STREAM: SOCK_DGRAM), 0); -- } -- if (fd == JVM_IO_ERR) { -+ -+ if ((fd = JVM_Socket(domain, type, 0)) == JVM_IO_ERR) { - /* note: if you run out of fds, you may not be able to load - * the exception class, and get a NoClassDefFoundError - * instead. +@@ -279,10 +279,21 @@ */ NET_ThrowNew(env, errno, "can't create socket"); return; @@ -12561,7 +12555,7 @@ +#ifdef AF_INET6 + /* Disable IPV6_V6ONLY to ensure dual-socket support */ -+ if (domain == AF_INET6) { ++ if (ipv6_available()) { + int arg = 0; + if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg, + sizeof(int)) < 0) { @@ -12575,7 +12569,7 @@ /* * If this is a server socket then enable SO_REUSEADDR * automatically and set to non blocking. -@@ -294,9 +303,15 @@ +@@ -291,9 +302,15 @@ if (ssObj != NULL) { int arg = 1; SET_NONBLOCKING(fd); @@ -12593,7 +12587,7 @@ } /* -@@ -528,9 +543,11 @@ +@@ -525,9 +542,11 @@ if (connect_rv == JVM_IO_INTR) { JNU_ThrowByName(env, JNU_JAVAIOPKG "InterruptedIOException", "operation interrupted"); @@ -12616,6 +12610,24 @@ /* * The fd table and the number of file descriptors +@@ -281,7 +281,7 @@ + + int NET_RecvFrom(int s, void *buf, int len, unsigned int flags, + struct sockaddr *from, int *fromlen) { +- BLOCKING_IO_RETURN_INT( s, recvfrom(s, buf, len, flags, from, (socklen_t)fromlen) ); ++ BLOCKING_IO_RETURN_INT( s, recvfrom(s, buf, len, flags, from, (socklen_t *)fromlen) ); + } + + int NET_Send(int s, void *msg, int len, unsigned int flags) { +@@ -298,7 +298,7 @@ + } + + int NET_Accept(int s, struct sockaddr *addr, int *addrlen) { +- BLOCKING_IO_RETURN_INT( s, accept(s, addr, (socklen_t)addrlen) ); ++ BLOCKING_IO_RETURN_INT( s, accept(s, addr, (socklen_t *)addrlen) ); + } + + int NET_Connect(int s, struct sockaddr *addr, int addrlen) { --- jdk/src/solaris/native/java/net/net_util_md.c +++ jdk/src/solaris/native/java/net/net_util_md.c @@ -34,6 +34,15 @@ @@ -12649,15 +12661,6 @@ jint IPv6_supported() { #ifndef AF_INET6 -@@ -230,7 +247,7 @@ - int fd; - void *ipv6_fn; - SOCKADDR sa; -- int sa_len = sizeof(sa); -+ socklen_t sa_len = sizeof(sa); - - fd = JVM_Socket(AF_INET6, SOCK_STREAM, 0) ; - if (fd < 0) { @@ -356,6 +373,7 @@ close(fd); return JNI_TRUE; @@ -12666,7 +12669,7 @@ void NET_AllocSockaddr(struct sockaddr **him, int *len) { -@@ -710,6 +728,10 @@ +@@ -707,6 +725,10 @@ him6->sin6_family = AF_INET6; *len = sizeof(struct sockaddr_in6) ; @@ -12677,24 +12680,16 @@ /* * On Linux if we are connecting to a link-local address * we need to specify the interface in the scope_id (2.4 kernel only) -@@ -1107,7 +1129,16 @@ +@@ -1104,7 +1126,7 @@ } #endif -+#ifdef __solaris__ - rv = getsockopt(fd, level, opt, result, len); -+#else -+ { -+ socklen_t socklen = *len; -+ rv = getsockopt(fd, level, opt, result, &socklen); -+ *len = socklen; -+ } -+#endif -+ +- rv = getsockopt(fd, level, opt, result, (socklen_t)len); ++ rv = getsockopt(fd, level, opt, result, (socklen_t *)len); if (rv < 0) { return rv; } -@@ -1154,6 +1185,24 @@ +@@ -1151,6 +1173,24 @@ #define IPTOS_PREC_MASK 0xe0 #endif @@ -12719,7 +12714,7 @@ /* * IPPROTO/IP_TOS :- * 1. IPv6 on Solaris: no-op and will be set in flowinfo -@@ -1186,6 +1235,10 @@ +@@ -1183,6 +1223,10 @@ *iptos &= (IPTOS_TOS_MASK | IPTOS_PREC_MASK); } @@ -12730,7 +12725,7 @@ /* * SOL_SOCKET/{SO_SNDBUF,SO_RCVBUF} - On Solaris need to * ensure that value is <= max_buf as otherwise we get -@@ -1233,6 +1286,84 @@ +@@ -1230,6 +1274,84 @@ } #endif