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 d07e1e03188072d4f826369109fcd1d5d06df731..425e00c6091703fbecea5ab78420e984d8efca7a 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; } @@ -1135,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()) { @@ -1161,8 +1187,8 @@ bool ExecConnect(ConnectContext *context) } if (context->proxyOptions == nullptr) { - if (!NonBlockConnect(context->GetSocketFd(), addr, len, context->options.GetTimeout())) { - ERROR_RETURN(context, "connect errno %{public}d", errno); + if (!HandleNonProxyConnection(context, addr, len)) { + return false; } } else { if (HandleTcpProxyOptions(context) != 0) {