src/java.base/unix/native/libnio/ch/Net.c
branchunixdomainchannels
changeset 59090 fb91b01624be
parent 59082 5e250ee9259e
child 59111 31b8ffbfe1b9
equal deleted inserted replaced
59082:5e250ee9259e 59090:fb91b01624be
    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;