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 e57c43aa1831e586debcad4fc6eef231af109edd..6d4e3777366613dc89abd8da50eee2e011c91ace 100644 --- a/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp +++ b/frameworks/js/napi/socket/socket_exec/src/socket_exec.cpp @@ -553,6 +553,21 @@ static bool PollFd(pollfd *fds, nfds_t num, int timeout) return true; } +static bool IsValidSock(int ¤tFd, const std::shared_ptr &manager) +{ + if (manager != nullptr) { + currentFd = static_cast(reinterpret_cast(manager->GetData())); + if (currentFd <= 0) { + NETSTACK_LOGE("currentFd: %{public}d is error", currentFd); + return false; + } + } else { + NETSTACK_LOGE("manager is error"); + return false; + } + return true; +} + static bool TcpSendEvent(TcpSendContext *context) { std::string encoding = context->options.GetEncoding(); @@ -789,6 +804,14 @@ static bool PreparePollFds(int ¤tFd, std::vector &fds, static void PollRecvData(int sock, sockaddr *addr, socklen_t addrLen, const MessageCallback &callback) { + std::unique_lock lock(g_fdMutex); + auto manager = callback.GetEventManager(); + int sockFd = -1; + if (!IsValidSock(sockFd, manager)) { + callback.OnError(ERRNO_BAD_FD); + PollRecvFinish(callback); + return; + } int bufferSize = ConfirmBufferSize(sock); auto buf = std::make_unique(bufferSize); auto addrDeleter = [](sockaddr *a) { free(reinterpret_cast(a)); }; @@ -798,7 +821,7 @@ static void PollRecvData(int sock, sockaddr *addr, socklen_t addrLen, const Mess if (recvTimeoutMs < 0) { return; } - + lock.unlock(); std::pair &, int> bufInfo{buf, bufferSize}; std::pair addrInfo{addr, addrLen}; std::unordered_map socketCallbackMap{}; @@ -2054,21 +2077,6 @@ static int PollSocket(int clientId, int connectFD, const std::shared_ptr &manager) -{ - if (manager != nullptr) { - currentFd = static_cast(reinterpret_cast(manager->GetData())); - if (currentFd <= 0) { - NETSTACK_LOGE("currentFd: %{public}d is error", currentFd); - return false; - } - } else { - NETSTACK_LOGE("manager is error"); - return false; - } - return true; -} - static int RecvWithSockCheck(int connectFD, char *buffer, uint32_t recvBufferSize, const std::shared_ptr &manager, int &recvSize) {