From c53a8459407f81ef802d49056be570c2dfec4d1e Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Tue, 15 Jul 2025 11:08:30 +0800 Subject: [PATCH 1/4] resolve bad fd problem Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- .../socket/socket_exec/src/socket_exec.cpp | 45 +++++++++++++------ 1 file changed, 32 insertions(+), 13 deletions(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index d07e1e031..ad62049f6 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -897,19 +897,27 @@ bool ExecBind(BindContext *context) int reuse = 0; auto manager = context->GetSharedManager(); - if (manager != nullptr) { - reuse = manager->GetReuseAddr(); - if (setsockopt(context->GetSocketFd(), SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&reuse), - sizeof(reuse)) < 0) { - NETSTACK_LOGE("set SO_REUSEADDR failed, fd: %{public}d", context->GetSocketFd()); - context->SetErrorCode(errno); - return false; - } + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return false; + } + std::unique_lock lock(manager->GetDataMutex()); + int socketfd = manager->GetData() ? static_cast(reinterpret_cast(manager->GetData())) : -1; + if (socketfd < 0) { + NETSTACK_LOGE("fd is nullptr or closed"); + return false; } - if (bind(context->GetSocketFd(), addr, len) < 0) { + reuse = manager->GetReuseAddr(); + if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, reinterpret_cast(&reuse), sizeof(reuse)) < 0) { + NETSTACK_LOGE("set SO_REUSEADDR failed, fd: %{public}d", socketfd); + context->SetErrorCode(errno); + return false; + } + + if (bind(socketfd, addr, len) < 0) { if (errno != EADDRINUSE) { - ERROR_RETURN(context, "bind failed, socket:%{public}d, errno:%{public}d", context->GetSocketFd(), errno); + ERROR_RETURN(context, "bind failed, socket:%{public}d, errno:%{public}d", socketfd, errno); } if (addr->sa_family == AF_INET) { NETSTACK_LOGI("distribute a random port"); @@ -918,12 +926,12 @@ bool ExecBind(BindContext *context) NETSTACK_LOGI("distribute a random port"); addr6.sin6_port = 0; /* distribute a random port */ } - if (bind(context->GetSocketFd(), addr, len) < 0) { - ERROR_RETURN(context, "rebind failed, socket:%{public}d, errno:%{public}d", context->GetSocketFd(), errno); + if (bind(socketfd, addr, len) < 0) { + ERROR_RETURN(context, "rebind failed, socket:%{public}d, errno:%{public}d", socketfd, errno); } NETSTACK_LOGI("rebind success"); } - NETSTACK_LOGI("bind success, sock:%{public}d", context->GetSocketFd()); + NETSTACK_LOGI("bind success, sock:%{public}d", socketfd); return true; } @@ -1161,6 +1169,17 @@ bool ExecConnect(ConnectContext *context) } if (context->proxyOptions == nullptr) { + auto manager = context->GetSharedManager(); + if (manager == nullptr) { + NETSTACK_LOGE("manager is nullptr"); + return false; + } + std::shared_lock lock(manager->GetDataMutex()); + int socketfd = manager->GetData() ? static_cast(reinterpret_cast(manager->GetData())) : -1; + if (socketfd < 0) { + NETSTACK_LOGE("fd is nullptr or closed"); + return false; + } if (!NonBlockConnect(context->GetSocketFd(), addr, len, context->options.GetTimeout())) { ERROR_RETURN(context, "connect errno %{public}d", errno); } -- Gitee From 8d62a663680c885a946dc20f79b6a9d34c22f280 Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Tue, 15 Jul 2025 12:06:56 +0800 Subject: [PATCH 2/4] resolve bad fd problem Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index ad62049f6..637dda77c 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -1171,7 +1171,6 @@ bool ExecConnect(ConnectContext *context) if (context->proxyOptions == nullptr) { auto manager = context->GetSharedManager(); if (manager == nullptr) { - NETSTACK_LOGE("manager is nullptr"); return false; } std::shared_lock lock(manager->GetDataMutex()); -- Gitee From d76d3d7029fa7733f173c82dcd6841c84a2f52be Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Tue, 15 Jul 2025 14:23:11 +0800 Subject: [PATCH 3/4] resolve bad fd problem Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- .../socket/socket_exec/src/socket_exec.cpp | 30 ++++++++++++------- 1 file changed, 19 insertions(+), 11 deletions(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index 637dda77c..f7022a7ac 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -1143,6 +1143,24 @@ static int HandleTcpProxyOptions(ConnectContext *context) return 0; } +bool HandleNonProxyConnection(ConnectContext *context, sockaddr *addr, socklen_t len) +{ + auto manager = context->GetSharedManager(); + if (manager == nullptr) { + return false; + } + std::shared_lock lock(manager->GetDataMutex()); + int socketfd = manager->GetData() ? static_cast(reinterpret_cast(manager->GetData())) : -1; + if (socketfd < 0) { + NETSTACK_LOGE("fd is nullptr or closed"); + return false; + } + if(!NonBlockConnect(context->GetSocketFd(), addr, len, context->options.GetTimeout())) { + ERROR_RETURN(context, "connect errno %{public}d", errno); + } + return true; +} + bool ExecConnect(ConnectContext *context) { if (!CommonUtils::HasInternetPermission()) { @@ -1169,19 +1187,9 @@ bool ExecConnect(ConnectContext *context) } if (context->proxyOptions == nullptr) { - auto manager = context->GetSharedManager(); - if (manager == nullptr) { - return false; - } - std::shared_lock lock(manager->GetDataMutex()); - int socketfd = manager->GetData() ? static_cast(reinterpret_cast(manager->GetData())) : -1; - if (socketfd < 0) { - NETSTACK_LOGE("fd is nullptr or closed"); + if(!HandleNonProxyConnection(context, addr, len)) { return false; } - if (!NonBlockConnect(context->GetSocketFd(), addr, len, context->options.GetTimeout())) { - ERROR_RETURN(context, "connect errno %{public}d", errno); - } } else { if (HandleTcpProxyOptions(context) != 0) { context->SetExecOK(false); -- Gitee From 48e4c48e0d3f6df4f67fc17d7de8fb516c75b87e Mon Sep 17 00:00:00 2001 From: HuuuuDaxia <2443930064@qq.com> Date: Tue, 15 Jul 2025 16:47:32 +0800 Subject: [PATCH 4/4] resolve bad fd problem Signed-off-by: HuuuuDaxia <2443930064@qq.com> --- frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp index f7022a7ac..425e00c60 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -1155,7 +1155,7 @@ bool HandleNonProxyConnection(ConnectContext *context, sockaddr *addr, socklen_t NETSTACK_LOGE("fd is nullptr or closed"); return false; } - if(!NonBlockConnect(context->GetSocketFd(), addr, len, context->options.GetTimeout())) { + if (!NonBlockConnect(context->GetSocketFd(), addr, len, context->options.GetTimeout())) { ERROR_RETURN(context, "connect errno %{public}d", errno); } return true; @@ -1187,7 +1187,7 @@ bool ExecConnect(ConnectContext *context) } if (context->proxyOptions == nullptr) { - if(!HandleNonProxyConnection(context, addr, len)) { + if (!HandleNonProxyConnection(context, addr, len)) { return false; } } else { -- Gitee