src/java.base/windows/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59090 fb91b01624be
parent 59082 5e250ee9259e
child 59111 31b8ffbfe1b9
--- a/src/java.base/windows/native/libnio/ch/Net.c	Thu Nov 14 15:01:49 2019 +0000
+++ b/src/java.base/windows/native/libnio/ch/Net.c	Thu Nov 14 17:43:07 2019 +0000
@@ -90,7 +90,7 @@
 extern jmethodID udsa_ctorID;
 extern jfieldID udsa_pathID;
 
-#define PATHLEN(len) (len - offsetof(struct sockaddr_un, sun_path))
+#define PATHLEN_UN(len) (len - offsetof(struct sockaddr_un, sun_path))
 
 JNIEXPORT jobject JNICALL
 NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
@@ -98,7 +98,7 @@
     if (sa->sun_family == AF_UNIX) {
         char *name;
 
-        if (PATHLEN(len) == 0) {
+        if (PATHLEN_UN(len) == 0) {
             name = "";
         } else {
             name = sa->sun_path;
@@ -112,12 +112,17 @@
 JNIEXPORT jint JNICALL
 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len)
 {
-    jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
+    jstring path;
+    memset(sa, 0, sizeof(struct sockaddr_un));
+    sa->sun_family = AF_UNIX;
+    if (uaddr == NULL) {
+        *len = (int)(offsetof(struct sockaddr_un, sun_path));
+        return 0;
+    }
+    path = (*env)->GetObjectField(env, uaddr, udsa_pathID);
     jboolean isCopy;
     int ret;
     const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy);
-    memset(sa, 0, sizeof(struct sockaddr_un));
-    sa->sun_family = AF_UNIX;
     size_t name_len = strlen(pname)+1;
     if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) {
         JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long");
@@ -149,7 +154,7 @@
 {
     SOCKET fd = socket(PF_UNIX, SOCK_STREAM, 0);
     if (fd == INVALID_SOCKET) {
-        return handleSocketError(env, errno);
+        return handleSocketError(env, WSAGetLastError());
     }
     return (int)fd;
 }
@@ -161,6 +166,11 @@
     int sa_len = 0;
     int rv = 0;
 
+/*
+    if (uaddr == NULL)
+        return;
+*/
+
     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
         return;
 
@@ -243,7 +253,7 @@
     struct sockaddr_un sa;
     socklen_t sa_len = sizeof(sa);
     if (getsockname(fdval(env, fdo), (struct sockaddr *)&sa, &sa_len) < 0) {
-        handleSocketError(env, errno);
+        handleSocketError(env, WSAGetLastError());
         return NULL;
     }
     return NET_SockaddrToUnixAddress(env, &sa, sa_len);