On Fri Oct 3 16:09:53 2025 +0000, Alexandre Julliard wrote:
TL;DL; Note GetBestRoute2 even zeroes output bestaddress in full and
that is backed by the tests. Whether GetBestRoute2 accesses src and dst in full or shorter part in case of ipv4 is currently not tested, but I think it more likely does on Windows (and if I didn't have to fixup dst address in the concerned place I would just do 'connect( s, (struct sockaddr *)dst, sizeof(*dst) )' and that access would happen in ws2_32 where it would copy the address for DeviceIoControl). That 'SOCKADDR_INET *' passed for dst, not a void pointer with explicit length, so from general sense it is totally valid to access the whole structure, and the implementation would naturally do it if it would, e. g., passing the address to nsiproxy or ws2_32 without interpreting here. This may be true of GetBestRoute2(), but I'm not sure that the same argument extends to GetBestInterfaceEx(). It takes a `struct sockaddr`, and it would seem legitimate to pass it that instead of a `SOCKADDR_INET`.
Uh, sorry, I missed here that 'struct sockaddr' is actually not a generic address but just ipv4 address and shorter than SOCKADDR_INET. What contributes to confusion is that GetBestInterfaceEx() actually supports ipv6 addresses (that is in tests). MS docs specify the argument as 'sockaddr *' [1] which assumes different handling based on protocol, while the actual headers definition (also in Windows SDK) has 'struct sockaddr *'.
I guess then we must leave GetBestInterface() alone and instead fill local SOCKADDR_INET in GetBestInterfaceEx() to pass to GetBestRoute2().
1. https://learn.microsoft.com/en-us/windows/win32/winsock/sockaddr-2