< prev index next >
src/java.base/unix/native/libnet/PlainDatagramSocketImpl.c
Print this page
rev 14618 : 8158023: SocketExceptions contain too little information sometimes
*** 216,242 ****
setDefaultScopeID(env, (struct sockaddr *)&him);
if (NET_Bind(fd, (struct sockaddr *)&him, len) < 0) {
if (errno == EADDRINUSE || errno == EADDRNOTAVAIL ||
errno == EPERM || errno == EACCES) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "BindException",
! "Bind failed");
} else {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Bind failed");
}
return;
}
/* initialize the local port */
if (localport == 0) {
/* Now that we're a connected socket, let's extract the port number
* that the system chose for us and store it in the Socket object.
*/
if (getsockname(fd, (struct sockaddr *)&him, &slen) == -1) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error getting socket name");
return;
}
localport = NET_GetPortFromSockaddr((struct sockaddr *)&him);
--- 216,242 ----
setDefaultScopeID(env, (struct sockaddr *)&him);
if (NET_Bind(fd, (struct sockaddr *)&him, len) < 0) {
if (errno == EADDRINUSE || errno == EADDRNOTAVAIL ||
errno == EPERM || errno == EACCES) {
! JNU_ThrowByNameWithLastError
! (env, JNU_JAVANETPKG "BindException", "Bind failed");
} else {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Bind failed");
}
return;
}
/* initialize the local port */
if (localport == 0) {
/* Now that we're a connected socket, let's extract the port number
* that the system chose for us and store it in the Socket object.
*/
if (getsockname(fd, (struct sockaddr *)&him, &slen) == -1) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
return;
}
localport = NET_GetPortFromSockaddr((struct sockaddr *)&him);
*** 279,290 ****
}
setDefaultScopeID(env, (struct sockaddr *)&rmtaddr);
if (NET_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "ConnectException",
! "Connect failed");
return;
}
}
--- 279,290 ----
}
setDefaultScopeID(env, (struct sockaddr *)&rmtaddr);
if (NET_Connect(fd, (struct sockaddr *)&rmtaddr, len) == -1) {
! JNU_ThrowByNameWithLastError
! (env, JNU_JAVANETPKG "ConnectException", "Connect failed");
return;
}
}
*** 467,477 ****
if (ret < 0) {
if (errno == ECONNREFUSED) {
JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException",
"ICMP Port Unreachable");
} else {
! NET_ThrowByNameWithLastError(env, "java/io/IOException", "sendto failed");
}
}
if (mallocedPacket) {
free(fullPacket);
--- 467,477 ----
if (ret < 0) {
if (errno == ECONNREFUSED) {
JNU_ThrowByName(env, JNU_JAVANETPKG "PortUnreachableException",
"ICMP Port Unreachable");
} else {
! JNU_ThrowIOExceptionWithLastError(env, "sendto failed");
}
}
if (mallocedPacket) {
free(fullPacket);
*** 518,528 ****
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else if (errno == ENOMEM) {
JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
} else {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed");
}
return ret;
}
}
--- 518,529 ----
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else if (errno == ENOMEM) {
JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
} else {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Peek failed");
}
return ret;
}
}
*** 542,552 ****
"ICMP Port Unreachable");
} else {
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Peek failed");
}
}
return 0;
}
--- 543,554 ----
"ICMP Port Unreachable");
} else {
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Peek failed");
}
}
return 0;
}
*** 614,624 ****
JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
#ifdef __linux__
} else if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
#else
} else {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
#endif
}
--- 616,627 ----
JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
#ifdef __linux__
} else if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Receive failed");
#else
} else {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
#endif
}
*** 679,689 ****
"ICMP Port Unreachable");
} else {
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
}
} else {
/*
* success - fill in received address...
--- 682,693 ----
"ICMP Port Unreachable");
} else {
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
}
} else {
/*
* success - fill in received address...
*** 825,835 ****
JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
#ifdef __linux__
} else if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
#else
} else {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
#endif
}
--- 829,840 ----
JNU_ThrowOutOfMemoryError(env, "NET_Timeout native heap allocation failed");
#ifdef __linux__
} else if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Receive failed");
#else
} else {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
#endif
}
*** 857,867 ****
"ICMP Port Unreachable");
} else {
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
}
} else {
int port;
jobject packetAddress;
--- 862,873 ----
"ICMP Port Unreachable");
} else {
if (errno == EBADF) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "Socket closed");
} else {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Receive failed");
}
}
} else {
int port;
jobject packetAddress;
*** 930,941 ****
"Socket closed");
return;
}
if ((fd = socket(domain, SOCK_DGRAM, 0)) == -1) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error creating socket");
return;
}
#ifdef AF_INET6
/* Disable IPV6_V6ONLY to ensure dual-socket support */
--- 936,947 ----
"Socket closed");
return;
}
if ((fd = socket(domain, SOCK_DGRAM, 0)) == -1) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error creating socket");
return;
}
#ifdef AF_INET6
/* Disable IPV6_V6ONLY to ensure dual-socket support */
*** 1078,1089 ****
}
}
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error setting socket option");
}
}
/*
* Set outgoing multicast interface designated by a NetworkInterface.
--- 1084,1095 ----
}
}
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
}
}
/*
* Set outgoing multicast interface designated by a NetworkInterface.
*** 1107,1118 ****
if (errno == EINVAL && index > 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"IPV6_MULTICAST_IF failed (interface has IPv4 "
"address only?)");
} else {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error setting socket option");
}
return;
}
}
--- 1113,1124 ----
if (errno == EINVAL && index > 0) {
JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
"IPV6_MULTICAST_IF failed (interface has IPv4 "
"address only?)");
} else {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
}
return;
}
}
*** 1127,1138 ****
in.s_addr = htonl( getInetAddress_addr(env, value) );
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error setting socket option");
}
}
/*
* Set outgoing multicast interface designated by an InetAddress.
--- 1133,1144 ----
in.s_addr = htonl( getInetAddress_addr(env, value) );
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(const char*)&in, sizeof(in)) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
}
}
/*
* Set outgoing multicast interface designated by an InetAddress.
*** 1254,1265 ****
CHECK_NULL(fid);
on = (*env)->GetBooleanField(env, value, fid);
loopback = (!on ? 1 : 0);
! if (NET_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_LOOP, (const void *)&loopback, sizeof(char)) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
return;
}
}
/*
--- 1260,1273 ----
CHECK_NULL(fid);
on = (*env)->GetBooleanField(env, value, fid);
loopback = (!on ? 1 : 0);
! if (NET_SetSockOpt(fd, IPPROTO_IP, IP_MULTICAST_LOOP,
! (const void *)&loopback, sizeof(char)) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
return;
}
}
/*
*** 1278,1289 ****
CHECK_NULL(fid);
on = (*env)->GetBooleanField(env, value, fid);
loopback = (!on ? 1 : 0);
! if (NET_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP, (const void *)&loopback, sizeof(int)) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
return;
}
}
#endif /* AF_INET6 */
--- 1286,1299 ----
CHECK_NULL(fid);
on = (*env)->GetBooleanField(env, value, fid);
loopback = (!on ? 1 : 0);
! if (NET_SetSockOpt(fd, IPPROTO_IPV6, IPV6_MULTICAST_LOOP,
! (const void *)&loopback, sizeof(int)) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
return;
}
}
#endif /* AF_INET6 */
*** 1418,1428 ****
return;
}
if (NET_SetSockOpt(fd, level, optname, (const void *)&optval, optlen) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
return;
}
}
--- 1428,1439 ----
return;
}
if (NET_SetSockOpt(fd, level, optname, (const void *)&optval, optlen) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
return;
}
}
*** 1481,1492 ****
struct in_addr *inP = ∈
socklen_t len = sizeof(struct in_addr);
if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(char *)inP, &len) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error getting socket option");
return NULL;
}
/*
* Construct and populate an Inet4Address
--- 1492,1503 ----
struct in_addr *inP = ∈
socklen_t len = sizeof(struct in_addr);
if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_IF,
(char *)inP, &len) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option");
return NULL;
}
/*
* Construct and populate an Inet4Address
*** 1579,1590 ****
jobject ni;
jobject ni_name;
if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error getting socket option");
return NULL;
}
if (ni_class == NULL) {
jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
--- 1590,1601 ----
jobject ni;
jobject ni_name;
if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_IF,
(char*)&index, &len) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option");
return NULL;
}
if (ni_class == NULL) {
jclass c = (*env)->FindClass(env, "java/net/NetworkInterface");
*** 1724,1735 ****
jobject iaObj;
len = SOCKADDR_LEN;
if (getsockname(fd, (struct sockaddr *)&him, &len) == -1) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error getting socket name");
return NULL;
}
iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&him, &port);
return iaObj;
--- 1735,1746 ----
jobject iaObj;
len = SOCKADDR_LEN;
if (getsockname(fd, (struct sockaddr *)&him, &len) == -1) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error getting socket name");
return NULL;
}
iaObj = NET_SockaddrToInetAddress(env, (struct sockaddr *)&him, &port);
return iaObj;
*** 1750,1761 ****
} else {
optlen = sizeof(optval.i);
}
if (NET_GetSockOpt(fd, level, optname, (void *)&optval, &optlen) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error getting socket option");
return NULL;
}
switch (opt) {
case java_net_SocketOptions_IP_MULTICAST_LOOP:
--- 1761,1772 ----
} else {
optlen = sizeof(optval.i);
}
if (NET_GetSockOpt(fd, level, optname, (void *)&optval, &optlen) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option");
return NULL;
}
switch (opt) {
case java_net_SocketOptions_IP_MULTICAST_LOOP:
*** 1803,1814 ****
*/
static void setTTL(JNIEnv *env, int fd, jint ttl) {
char ittl = (char)ttl;
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl,
sizeof(ittl)) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error setting socket option");
}
}
/*
* Set hops limit for a socket. Throw exception if failed.
--- 1814,1825 ----
*/
static void setTTL(JNIEnv *env, int fd, jint ttl) {
char ittl = (char)ttl;
if (setsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL, (char*)&ittl,
sizeof(ittl)) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
}
}
/*
* Set hops limit for a socket. Throw exception if failed.
*** 1816,1827 ****
#ifdef AF_INET6
static void setHopLimit(JNIEnv *env, int fd, jint ttl) {
int ittl = (int)ttl;
if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
(char*)&ittl, sizeof(ittl)) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error setting socket option");
}
}
#endif
/*
--- 1827,1838 ----
#ifdef AF_INET6
static void setHopLimit(JNIEnv *env, int fd, jint ttl) {
int ittl = (int)ttl;
if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
(char*)&ittl, sizeof(ittl)) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error setting socket option");
}
}
#endif
/*
*** 1899,1922 ****
int ttl = 0;
socklen_t len = sizeof(ttl);
if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
(char*)&ttl, &len) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error getting socket option");
return -1;
}
return (jint)ttl;
} else
#endif /* AF_INET6 */
{
u_char ttl = 0;
socklen_t len = sizeof(ttl);
if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL,
(char*)&ttl, &len) < 0) {
! NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
! "Error getting socket option");
return -1;
}
return (jint)ttl;
}
}
--- 1910,1933 ----
int ttl = 0;
socklen_t len = sizeof(ttl);
if (getsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS,
(char*)&ttl, &len) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option");
return -1;
}
return (jint)ttl;
} else
#endif /* AF_INET6 */
{
u_char ttl = 0;
socklen_t len = sizeof(ttl);
if (getsockopt(fd, IPPROTO_IP, IP_MULTICAST_TTL,
(char*)&ttl, &len) < 0) {
! JNU_ThrowByNameWithMessageAndLastError
! (env, JNU_JAVANETPKG "SocketException", "Error getting socket option");
return -1;
}
return (jint)ttl;
}
}
< prev index next >