@@ -133,23 +133,23 @@ static jobject createDatagramSocketAddress(JNIEnv* env, const struct sockaddr_st
133133 return obj ;
134134}
135135
136- static jobject createDomainDatagramSocketAddress (JNIEnv * env , const struct sockaddr_storage * addr , int len , jobject local ) {
137- jclass domainDatagramSocketAddressClass = NULL ;
138- jobject obj = NULL ;
139- struct sockaddr_un * s = (struct sockaddr_un * ) addr ;
136+ static int domainSocketPathLength (const struct sockaddr_un * s , const socklen_t addrlen ) {
140137#ifdef __linux__
141138 // Linux supports abstract domain sockets so we need to handle it.
142139 // https://man7.org/linux/man-pages/man7/unix.7.html
143- int pathLength = 0 ;
144- if (s -> sun_path [0 ] == '\0' ) {
140+ if (addrlen >= sizeof (sa_family_t ) && s -> sun_path [0 ] == '\0' ) {
145141 // This is an abstract domain socket address
146- pathLength = strlen (& (s -> sun_path [1 ])) + 1 ;
147- } else {
148- pathLength = strlen (s -> sun_path );
142+ return (addrlen - sizeof (sa_family_t ));
149143 }
150- #else
151- int pathLength = strlen (s -> sun_path );
152144#endif
145+ return strlen (s -> sun_path );
146+ }
147+
148+ static jobject createDomainDatagramSocketAddress (JNIEnv * env , const struct sockaddr_storage * addr , const socklen_t addrlen , int len , jobject local ) {
149+ jclass domainDatagramSocketAddressClass = NULL ;
150+ jobject obj = NULL ;
151+ struct sockaddr_un * s = (struct sockaddr_un * ) addr ;
152+ int pathLength = domainSocketPathLength (s , addrlen );
153153 jbyteArray pathBytes = (* env )-> NewByteArray (env , pathLength );
154154 if (pathBytes == NULL ) {
155155 return NULL ;
@@ -169,21 +169,9 @@ static jobject createDomainDatagramSocketAddress(JNIEnv* env, const struct socka
169169 return obj ;
170170}
171171
172- static jbyteArray netty_unix_socket_createDomainSocketAddressArray (JNIEnv * env , const struct sockaddr_storage * addr ) {
172+ static jbyteArray netty_unix_socket_createDomainSocketAddressArray (JNIEnv * env , const struct sockaddr_storage * addr , const socklen_t addrlen ) {
173173 struct sockaddr_un * s = (struct sockaddr_un * ) addr ;
174- #ifdef __linux__
175- // Linux supports abstract domain sockets so we need to handle it.
176- // https://man7.org/linux/man-pages/man7/unix.7.html
177- int pathLength = 0 ;
178- if (s -> sun_path [0 ] == '\0' ) {
179- // This is an abstract domain socket address
180- pathLength = strlen (& (s -> sun_path [1 ])) + 1 ;
181- } else {
182- pathLength = strlen (s -> sun_path );
183- }
184- #else
185- int pathLength = strlen (s -> sun_path );
186- #endif
174+ int pathLength = domainSocketPathLength (s , addrlen );
187175 jbyteArray pathBytes = (* env )-> NewByteArray (env , pathLength );
188176 if (pathBytes == NULL ) {
189177 return NULL ;
@@ -488,7 +476,7 @@ static jobject _recvFromDomainSocket(JNIEnv* env, jint fd, void* buffer, jint po
488476 return NULL ;
489477 }
490478
491- return createDomainDatagramSocketAddress (env , & addr , res , NULL );
479+ return createDomainDatagramSocketAddress (env , & addr , addrlen , res , NULL );
492480}
493481
494482static jint _send (JNIEnv * env , jclass clazz , jint fd , void * buffer , jint pos , jint limit ) {
@@ -733,7 +721,7 @@ static jbyteArray netty_unix_socket_remoteDomainSocketAddress(JNIEnv* env, jclas
733721 if (getpeername (fd , (struct sockaddr * ) & addr , & len ) == -1 ) {
734722 return NULL ;
735723 }
736- return netty_unix_socket_createDomainSocketAddressArray (env , & addr );
724+ return netty_unix_socket_createDomainSocketAddressArray (env , & addr , len );
737725}
738726
739727static jbyteArray netty_unix_socket_localAddress (JNIEnv * env , jclass clazz , jint fd ) {
@@ -751,7 +739,7 @@ static jbyteArray netty_unix_socket_localDomainSocketAddress(JNIEnv* env, jclass
751739 if (getsockname (fd , (struct sockaddr * ) & addr , & len ) == -1 ) {
752740 return NULL ;
753741 }
754- return netty_unix_socket_createDomainSocketAddressArray (env , & addr );
742+ return netty_unix_socket_createDomainSocketAddressArray (env , & addr , len );
755743}
756744
757745static jint netty_unix_socket_newSocketDgramFd (JNIEnv * env , jclass clazz , jboolean ipv6 ) {
0 commit comments