--- 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);
}
/**