Greetings:

Why does the procedure:
Java_java_net_PlainDatagramSocketImpl_datagramSocketCreate(...), defined
in the file: jdk/src/solaris/native/java/net/PlainDatagramSocketImpl.c,
close the given socket before returning after an error in some cases,
but not others? Shouldn't the behaviour be the same throughout the
procedure? I think this behaviour should be: throw exception, close socket, 
return.

For examples consider the following:
    if ((fd = JVM_Socket(domain, SOCK_DGRAM, 0)) == JVM_IO_ERR) {
        NET_ThrowByNameWithLastError(env, JNU_JAVANETPKG "SocketException",
                       "Error creating socket");
        return;
    }
In this case, the socket was never opened, so there no need to
close it.
#ifdef AF_INET6
    /* Disable IPV6_V6ONLY to ensure dual-socket support */
    if (domain == AF_INET6) {
        arg = 0;
        if (setsockopt(fd, IPPROTO_IPV6, IPV6_V6ONLY, (char*)&arg,
                       sizeof(int)) < 0) {
            NET_ThrowNew(env, errno, "cannot set IPPROTO_IPV6");
            close(fd); <<<< This seems OK
            return;
        }
    }
#endif /* AF_INET6 */

#ifdef __APPLE__
    arg = 65507;
    if (JVM_SetSockOpt(fd, SOL_SOCKET, SO_SNDBUF,
                       (char *)&arg, sizeof(arg)) < 0) {
        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                        strerror(errno));
        return; <<<<<<<<<< Why not close it? If we can't allocate the
desired buffer size, is it then OK, to just use what we have? It's
interesting that this would fail...
    }
    if (JVM_SetSockOpt(fd, SOL_SOCKET, SO_RCVBUF,
                       (char *)&arg, sizeof(arg)) < 0) {
        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                        strerror(errno));
        return; <<<< likewise
    }
#endif /* __APPLE__ */

     if (setsockopt(fd, SOL_SOCKET, SO_BROADCAST, (char*) &t,
sizeof(int))<0) {
        JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException",
                        "Unable to set SO_BROADCAST");
        return; <<< setsockopt() failed, we threw an exception. We
didn't close the socket.
     }


--
John Zavgren
john.zavg...@oracle.com
603-821-0904
US-Burlington-MA



Reply via email to