8222562: Don't set IPV6_V6ONLY when IPv4 is not available
Reviewed-by: dfuchs, chegar
This commit is contained in:
parent
6f8821cadc
commit
0465104af6
@ -27,12 +27,19 @@
|
||||
|
||||
#include "java_net_InetAddress.h"
|
||||
|
||||
int IPv4_supported();
|
||||
int IPv6_supported();
|
||||
int reuseport_supported();
|
||||
|
||||
static int IPv4_available;
|
||||
static int IPv6_available;
|
||||
static int REUSEPORT_available;
|
||||
|
||||
JNIEXPORT jint JNICALL ipv4_available()
|
||||
{
|
||||
return IPv4_available;
|
||||
}
|
||||
|
||||
JNIEXPORT jint JNICALL ipv6_available()
|
||||
{
|
||||
return IPv6_available;
|
||||
@ -68,6 +75,7 @@ DEF_JNI_OnLoad(JavaVM *vm, void *reserved)
|
||||
* check now whether we have IPv6 on this platform and if the
|
||||
* supporting socket APIs are available
|
||||
*/
|
||||
IPv4_available = IPv4_supported();
|
||||
IPv6_available = IPv6_supported() & (!preferIPv4Stack);
|
||||
|
||||
/* check if SO_REUSEPORT is supported on this platform */
|
||||
|
@ -126,6 +126,7 @@ void NET_ThrowCurrent(JNIEnv *env, char *msg);
|
||||
|
||||
jfieldID NET_GetFileDescriptorID(JNIEnv *env);
|
||||
|
||||
JNIEXPORT jint JNICALL ipv4_available();
|
||||
JNIEXPORT jint JNICALL ipv6_available();
|
||||
|
||||
JNIEXPORT jint JNICALL reuseport_available();
|
||||
|
@ -915,8 +915,10 @@ Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate(JNIEnv *env,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Disable IPV6_V6ONLY to ensure dual-socket support */
|
||||
if (domain == AF_INET6) {
|
||||
/*
|
||||
* If IPv4 is available, disable IPV6_V6ONLY to ensure dual-socket support.
|
||||
*/
|
||||
if (domain == AF_INET6 && ipv4_available()) {
|
||||
arg = 0;
|
||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg,
|
||||
sizeof(int)) < 0) {
|
||||
|
@ -187,8 +187,10 @@ Java_java_net_PlainSocketImpl_socketCreate(JNIEnv *env, jobject this,
|
||||
return;
|
||||
}
|
||||
|
||||
/* Disable IPV6_V6ONLY to ensure dual-socket support */
|
||||
if (domain == AF_INET6) {
|
||||
/*
|
||||
* If IPv4 is available, disable IPV6_V6ONLY to ensure dual-socket support.
|
||||
*/
|
||||
if (domain == AF_INET6 && ipv4_available()) {
|
||||
int arg = 0;
|
||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg,
|
||||
sizeof(int)) < 0) {
|
||||
|
@ -278,6 +278,16 @@ NET_GetFileDescriptorID(JNIEnv *env)
|
||||
return (*env)->GetFieldID(env, cls, "fd", "I");
|
||||
}
|
||||
|
||||
jint IPv4_supported()
|
||||
{
|
||||
int fd = socket(AF_INET, SOCK_STREAM, 0) ;
|
||||
if (fd < 0) {
|
||||
return JNI_FALSE;
|
||||
}
|
||||
close(fd);
|
||||
return JNI_TRUE;
|
||||
}
|
||||
|
||||
#if defined(DONT_ENABLE_IPV6)
|
||||
jint IPv6_supported()
|
||||
{
|
||||
|
@ -216,8 +216,10 @@ Java_sun_nio_ch_Net_socket0(JNIEnv *env, jclass cl, jboolean preferIPv6,
|
||||
return handleSocketError(env, errno);
|
||||
}
|
||||
|
||||
/* Disable IPV6_V6ONLY to ensure dual-socket support */
|
||||
if (domain == AF_INET6) {
|
||||
/*
|
||||
* If IPv4 is available, disable IPV6_V6ONLY to ensure dual-socket support.
|
||||
*/
|
||||
if (domain == AF_INET6 && ipv4_available()) {
|
||||
int arg = 0;
|
||||
if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg,
|
||||
sizeof(int)) < 0) {
|
||||
|
@ -214,6 +214,12 @@ NET_GetFileDescriptorID(JNIEnv *env)
|
||||
return (*env)->GetFieldID(env, cls, "fd", "I");
|
||||
}
|
||||
|
||||
jint IPv4_supported()
|
||||
{
|
||||
/* TODO: properly check for IPv4 support on Windows */
|
||||
return JNI_TRUE;
|
||||
}
|
||||
|
||||
jint IPv6_supported()
|
||||
{
|
||||
SOCKET s = socket(AF_INET6, SOCK_STREAM, 0) ;
|
||||
|
Loading…
x
Reference in New Issue
Block a user