src/java.base/unix/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59090 fb91b01624be
parent 59082 5e250ee9259e
child 59111 31b8ffbfe1b9
--- a/src/java.base/unix/native/libnio/ch/Net.c	Thu Nov 14 15:01:49 2019 +0000
+++ b/src/java.base/unix/native/libnio/ch/Net.c	Thu Nov 14 17:43:07 2019 +0000
@@ -73,20 +73,25 @@
 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;
-    int name_len = strlen(pname) + 1; /* includes null termination */
+    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");
         ret = 1;
         goto finish;
     }
-    strncpy(&sa->sun_path[0], pname, name_len);
-    *len = offsetof(struct sockaddr_un, sun_path) + name_len;
+    strncpy(sa->sun_path, pname, name_len);
+    *len = (int)(offsetof(struct sockaddr_un, sun_path) + name_len);
     ret = 0;
   finish:
     if (isCopy)