diff --git a/src/network/core/host.cpp b/src/network/core/host.cpp index 7504f6986f..cf999c24f9 100644 --- a/src/network/core/host.cpp +++ b/src/network/core/host.cpp @@ -27,35 +27,34 @@ static void NetworkFindBroadcastIPsInternal(NetworkAddressList *broadcast) // Wi SOCKET sock = socket(AF_INET, SOCK_DGRAM, 0); if (sock == INVALID_SOCKET) return; - DWORD len = 0; - int num = 2; - INTERFACE_INFO *ifo = CallocT(num); + std::vector ifos; + ifos.resize(2); for (;;) { - if (WSAIoctl(sock, SIO_GET_INTERFACE_LIST, nullptr, 0, ifo, num * sizeof(*ifo), &len, nullptr, nullptr) == 0) break; - free(ifo); + DWORD len = 0; + if (WSAIoctl(sock, SIO_GET_INTERFACE_LIST, nullptr, 0, ifos.data(), static_cast(ifos.size() * sizeof(INTERFACE_INFO)), &len, nullptr, nullptr) == 0) { + ifos.resize(len / sizeof(INTERFACE_INFO)); + break; + } if (WSAGetLastError() != WSAEFAULT) { closesocket(sock); return; } - num *= 2; - ifo = CallocT(num); + ifos.resize(ifos.size() * 2); } - for (uint j = 0; j < len / sizeof(*ifo); j++) { - if (ifo[j].iiFlags & IFF_LOOPBACK) continue; - if (!(ifo[j].iiFlags & IFF_BROADCAST)) continue; + for (auto &ifo : ifos) { + if (ifo.iiFlags & IFF_LOOPBACK) continue; + if (!(ifo.iiFlags & IFF_BROADCAST)) continue; - sockaddr_storage address; - memset(&address, 0, sizeof(address)); + sockaddr_storage address{}; /* iiBroadcast is unusable, because it always seems to be set to 255.255.255.255. */ - memcpy(&address, &ifo[j].iiAddress.Address, sizeof(sockaddr)); - ((sockaddr_in*)&address)->sin_addr.s_addr = ifo[j].iiAddress.AddressIn.sin_addr.s_addr | ~ifo[j].iiNetmask.AddressIn.sin_addr.s_addr; + memcpy(&address, &ifo.iiAddress.Address, sizeof(sockaddr)); + reinterpret_cast(&address)->sin_addr.s_addr = ifo.iiAddress.AddressIn.sin_addr.s_addr | ~ifo.iiNetmask.AddressIn.sin_addr.s_addr; NetworkAddress addr(address, sizeof(sockaddr)); if (std::none_of(broadcast->begin(), broadcast->end(), [&addr](NetworkAddress const &elem) -> bool { return elem == addr; })) broadcast->push_back(addr); } - free(ifo); closesocket(sock); }