[PATCH v4] ws2_32: Return WSAEAFNOSUPPORT when ip4/6 disabled
Brendan McGrath
brendan at redmandi.com
Wed Nov 14 20:52:53 CST 2018
Currently, when IPv6 is disabled by the kernel, attempting to use
the 'WebRequest' API with .NET native causes a crash. This can be
recreated using the following gist:
https://gist.github.com/redmcg/7d81ef833c77bee6965b5f441006f697
This patch fixes the crash by returning WSAEAFNOSUPPORT, as expected
by .NET. See:
https://referencesource.microsoft.com/#System/net/System/Net/Sockets/Socket.cs,5995
Signed-off-by: Brendan McGrath <brendan at redmandi.com>
---
Changes since v3:
- fix broken tests (by only returning WSAEAFNOSUPPORT on assumed working protocol combinations)
dlls/ws2_32/socket.c | 15 +++++++++++++--
1 file changed, 13 insertions(+), 2 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index df068fe8527..d77b6404105 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -7646,8 +7646,19 @@ SOCKET WINAPI WSASocketW(int af, int type, int protocol,
/* invalid combination of valid parameters, like SOCK_STREAM + IPPROTO_UDP */
if (err == WSAEINVAL)
err = WSAESOCKTNOSUPPORT;
- else if (err == WSAEOPNOTSUPP)
- err = WSAEPROTONOSUPPORT;
+ else if (err == WSAEOPNOTSUPP) {
+ if (unixtype == SOCK_STREAM && protocol == IPPROTO_TCP &&
+ (unixaf == AF_INET || unixaf == AF_INET6))
+ err = WSAEAFNOSUPPORT;
+ else if (unixtype == SOCK_DGRAM && protocol == IPPROTO_IP &&
+ (unixaf == AF_INET || unixaf == AF_INET6))
+ err = WSAEAFNOSUPPORT;
+ else if (unixtype == SOCK_DGRAM && protocol == IPPROTO_IPV6 &&
+ unixaf == AF_INET6)
+ err = WSAEAFNOSUPPORT;
+ else
+ err = WSAEPROTONOSUPPORT;
+ }
}
done:
--
2.17.1
More information about the wine-devel
mailing list