71 } |
71 } |
72 |
72 |
73 JNIEXPORT jint JNICALL |
73 JNIEXPORT jint JNICALL |
74 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len) |
74 NET_UnixSocketAddressToSockaddr(JNIEnv *env, jobject uaddr, struct sockaddr_un *sa, int *len) |
75 { |
75 { |
76 jstring path = (*env)->GetObjectField(env, uaddr, udsa_pathID); |
76 jstring path; |
|
77 memset(sa, 0, sizeof(struct sockaddr_un)); |
|
78 sa->sun_family = AF_UNIX; |
|
79 if (uaddr == NULL) { |
|
80 *len = (int)(offsetof(struct sockaddr_un, sun_path)); |
|
81 return 0; |
|
82 } |
|
83 path = (*env)->GetObjectField(env, uaddr, udsa_pathID); |
77 jboolean isCopy; |
84 jboolean isCopy; |
78 int ret; |
85 int ret; |
79 const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy); |
86 const char* pname = JNU_GetStringPlatformChars(env, path, &isCopy); |
80 memset(sa, 0, sizeof(struct sockaddr_un)); |
87 size_t name_len = strlen(pname)+1; |
81 sa->sun_family = AF_UNIX; |
|
82 int name_len = strlen(pname) + 1; /* includes null termination */ |
|
83 if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) { |
88 if (name_len > MAX_UNIX_DOMAIN_PATH_LEN) { |
84 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long"); |
89 JNU_ThrowByName(env, JNU_JAVANETPKG "SocketException", "unix domain path too long"); |
85 ret = 1; |
90 ret = 1; |
86 goto finish; |
91 goto finish; |
87 } |
92 } |
88 strncpy(&sa->sun_path[0], pname, name_len); |
93 strncpy(sa->sun_path, pname, name_len); |
89 *len = offsetof(struct sockaddr_un, sun_path) + name_len; |
94 *len = (int)(offsetof(struct sockaddr_un, sun_path) + name_len); |
90 ret = 0; |
95 ret = 0; |
91 finish: |
96 finish: |
92 if (isCopy) |
97 if (isCopy) |
93 JNU_ReleaseStringPlatformChars(env, path, pname); |
98 JNU_ReleaseStringPlatformChars(env, path, pname); |
94 return ret; |
99 return ret; |