src/java.base/unix/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59082 5e250ee9259e
parent 59076 998df1368cca
child 59090 fb91b01624be
--- a/src/java.base/unix/native/libnio/ch/Net.c	Thu Nov 14 12:40:13 2019 +0000
+++ b/src/java.base/unix/native/libnio/ch/Net.c	Thu Nov 14 15:01:49 2019 +0000
@@ -51,12 +51,19 @@
 extern jmethodID udsa_ctorID;
 extern jfieldID udsa_pathID;
 
+#define PATHLEN(len) (len - offsetof(struct sockaddr_un, sun_path))
+
 JNIEXPORT jobject JNICALL
-NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa) {
+NET_SockaddrToUnixAddress(JNIEnv *env, struct sockaddr_un *sa, socklen_t len) {
 
     if (sa->sun_family == AF_UNIX) {
-        char *name = sa->sun_path;
+        char *name;
 
+        if (PATHLEN(len) == 0) {
+            name = "";
+        } else {
+            name = sa->sun_path;
+        }
         jstring nstr = JNU_NewStringPlatform(env, name);
         return (*env)->NewObject(env, udsa_class, udsa_ctorID, nstr);
     }
@@ -110,8 +117,8 @@
     int sa_len = 0;
     int rv = 0;
 
-    if (uaddr == NULL) 
-	return; /* Rely on implicit bind */
+    if (uaddr == NULL)
+        return; /* Rely on implicit bind */
 
     if (NET_UnixSocketAddressToSockaddr(env, uaddr, &sa, &sa_len) != 0)
         return;
@@ -180,7 +187,7 @@
 
     setfdval(env, newfdo, newfd);
 
-    usa = NET_SockaddrToUnixAddress(env, &sa);
+    usa = NET_SockaddrToUnixAddress(env, &sa, sa_len);
     CHECK_NULL_RETURN(usa, IOS_THROWN);
 
     (*env)->SetObjectArrayElement(env, usaa, 0, usa);
@@ -198,7 +205,7 @@
         handleSocketError(env, errno);
         return NULL;
     }
-    return NET_SockaddrToUnixAddress(env, &sa);
+    return NET_SockaddrToUnixAddress(env, &sa, sa_len);
 }
 
 /**