From 8f82cf908cb1a40bf4407bbdd5755c53fe4bb708 Mon Sep 17 00:00:00 2001 From: igerasim Date: Tue, 7 Jun 2016 00:29:22 +0300 Subject: [PATCH] 8073542: File Leak in jdk/src/java/base/unix/native/libnet/PlainDatagramSocketImpl.c Summary: ensure that file descriptor is properly closed if setsockopt fails. Reviewed-by: rriggs --- .../native/java/net/PlainDatagramSocketImpl.c | 20 +++++++++++++++---- 1 file changed, 16 insertions(+), 4 deletions(-) diff --git a/src/solaris/native/java/net/PlainDatagramSocketImpl.c b/src/solaris/native/java/net/PlainDatagramSocketImpl.c index 77899d627..406654d20 100644 --- a/src/solaris/native/java/net/PlainDatagramSocketImpl.c +++ b/src/solaris/native/java/net/PlainDatagramSocketImpl.c @@ -992,17 +992,24 @@ Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate(JNIEnv *env, (char *)&arg, sizeof(arg)) < 0) { getErrorString(errno, tmpbuf, sizeof(tmpbuf)); JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", tmpbuf); + close(fd); return; } if (JVM_SetSockOpt(fd, SOL_SOCKET, SO_RCVBUF, (char *)&arg, sizeof(arg)) < 0) { getErrorString(errno, tmpbuf, sizeof(tmpbuf)); JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", tmpbuf); + close(fd); return; } #endif /* __APPLE__ */ - setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*) &t, sizeof(int)); + if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*) &t, sizeof (int)) < 0) { + getErrorString(errno, tmpbuf, sizeof(tmpbuf)); + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", tmpbuf); + close(fd); + return; + } #if defined(__linux__) arg = 0; @@ -1024,8 +1031,13 @@ Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate(JNIEnv *env, */ if (domain == AF_INET6) { int ttl = 1; - setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *)&ttl, - sizeof(ttl)); + if (setsockopt(fd, IPPROTO_IPV6, IPV6_MULTICAST_HOPS, (char *) &ttl, + sizeof (ttl)) < 0) { + getErrorString(errno, tmpbuf, sizeof(tmpbuf)); + JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", tmpbuf); + close(fd); + return; + } } #endif /* __linux__ */ @@ -2182,7 +2194,7 @@ static void mcast_join_leave(JNIEnv *env, jobject this, caddr[14] = ((address >> 8) & 0xff); caddr[15] = (address & 0xff); } else { - getInet6Address_ipaddress(env, iaObj, caddr); + getInet6Address_ipaddress(env, iaObj, (char *) caddr); } memcpy((void *)&(mname6.ipv6mr_multiaddr), caddr, sizeof(struct in6_addr)); -- GitLab