diff --git a/src/libs/network.cpp b/src/libs/network.cpp index 369ba2a6e..b888c9440 100644 --- a/src/libs/network.cpp +++ b/src/libs/network.cpp @@ -2025,22 +2025,27 @@ int64_t KYTY_SYSV_ABI Recvfrom(int s, void* buf, uint64_t len, int flags, void* const auto host_len = static_cast( std::min(len, std::numeric_limits::max())); - int64_t result = 0; + sockaddr_storage host_addr {}; + SocketLength host_addrlen = sizeof(host_addr); + int64_t result = 0; if (addr == nullptr) { result = ::recv(socket, static_cast(buf), host_len, host_flags); } else { - sockaddr_storage host_addr {}; - SocketLength host_addrlen = sizeof(host_addr); result = ::recvfrom(socket, static_cast(buf), host_len, host_flags, reinterpret_cast(&host_addr), &host_addrlen); - if (result >= 0 && - ConvertHostSockaddr(&host_addr, host_addrlen, addr, addrlen) != 0) { - return -1; - } } +#if defined(_WIN32) + if (result < 0 && WSAGetLastError() == WSAEMSGSIZE) { + // Winsock copied the datagram prefix; POSIX reports its length as success. + result = host_len; + } +#endif if (result < 0) { return SetHostSocketError(); } + if (addr != nullptr && ConvertHostSockaddr(&host_addr, host_addrlen, addr, addrlen) != 0) { + return -1; + } return result; }