Skip to content

Commit

Permalink
Call ReleaseByteArrayElements even when handling of socket_path fails… (
Browse files Browse the repository at this point in the history
#13435)

… to fix small mem leak

Motivation:

We need to ensure we always call ReleaseByteArrayElements otherwise we
leak memory.

Modifications:

Always call ReleaseByteArrayElements even when validation / handling of
socket_path fails

Result:

Fix possible small memory leak
  • Loading branch information
normanmaurer committed Jun 13, 2023
1 parent 0c33b09 commit bdb7873
Showing 1 changed file with 4 additions and 3 deletions.
7 changes: 4 additions & 3 deletions transport-native-unix-common/src/main/c/netty_unix_socket.c
Expand Up @@ -843,16 +843,17 @@ static jint netty_unix_socket_bindDomainSocket(JNIEnv* env, jclass clazz, jint f
jint socket_path_len = (*env)->GetArrayLength(env, socketPath);

if (socket_path_len > sizeof(addr.sun_path) || (socket_path_len == sizeof(addr.sun_path) && socket_path[socket_path_len] != '\0')) {
(*env)->ReleaseByteArrayElements(env, socketPath, socket_path, 0);
return -ENAMETOOLONG;
}
memcpy(addr.sun_path, socket_path, socket_path_len);
(*env)->ReleaseByteArrayElements(env, socketPath, socket_path, 0);

if (unlink((const char*) addr.sun_path) == -1 && errno != ENOENT) {
return -errno;
}

int res = bind(fd, (struct sockaddr*) &addr, _UNIX_ADDR_LENGTH(socket_path_len));
(*env)->ReleaseByteArrayElements(env, socketPath, socket_path, 0);

if (res == -1) {
return -errno;
Expand All @@ -871,18 +872,18 @@ static jint netty_unix_socket_connectDomainSocket(JNIEnv* env, jclass clazz, jin
socket_path_len = (*env)->GetArrayLength(env, socketPath);

if (socket_path_len > sizeof(addr.sun_path) || (socket_path_len == sizeof(addr.sun_path) && socket_path[socket_path_len] != '\0')) {
(*env)->ReleaseByteArrayElements(env, socketPath, socket_path, 0);
return -ENAMETOOLONG;
}
memcpy(addr.sun_path, socket_path, socket_path_len);
(*env)->ReleaseByteArrayElements(env, socketPath, socket_path, 0);

int res;
int err;
do {
res = connect(fd, (struct sockaddr*) &addr, _UNIX_ADDR_LENGTH(socket_path_len));
} while (res == -1 && ((err = errno) == EINTR));

(*env)->ReleaseByteArrayElements(env, socketPath, socket_path, 0);

if (res < 0) {
return -err;
}
Expand Down

0 comments on commit bdb7873

Please sign in to comment.