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....
Signed-off-by: Brendan McGrath brendan@redmandi.com --- Changes since v4: - from the server: map EAFNOSUPPORT from the kernel to STATUS_NOT_IMPLEMENTED - in ws2_32: map STATUS_NOT_IMPLEMENTED to WSAEAFNOSUPPORT
It's still a bit ugly - but short of changing the design by removing the need for a NTSTATUS - I'm not sure there's a better way.
dlls/ws2_32/socket.c | 1 + server/sock.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c index df068fe8527..1d433086f11 100644 --- a/dlls/ws2_32/socket.c +++ b/dlls/ws2_32/socket.c @@ -1067,6 +1067,7 @@ static inline DWORD NtStatusToWSAError( const DWORD status ) case STATUS_BUFFER_OVERFLOW: wserr = WSAEMSGSIZE; break; case STATUS_NOT_SUPPORTED: wserr = WSAEOPNOTSUPP; break; case STATUS_HOST_UNREACHABLE: wserr = WSAEHOSTUNREACH; break; + case STATUS_NOT_IMPLEMENTED: wserr = WSAEAFNOSUPPORT; break;
default: wserr = RtlNtStatusToDosError( status ); diff --git a/server/sock.c b/server/sock.c index a8e6e28599b..dfcbab530fe 100644 --- a/server/sock.c +++ b/server/sock.c @@ -912,8 +912,8 @@ static int sock_get_ntstatus( int err ) case EPROTONOSUPPORT: case ESOCKTNOSUPPORT: case EPFNOSUPPORT: - case EAFNOSUPPORT: case EPROTOTYPE: return STATUS_NOT_SUPPORTED; + case EAFNOSUPPORT: return STATUS_NOT_IMPLEMENTED; case ENOPROTOOPT: return STATUS_INVALID_PARAMETER; case EOPNOTSUPP: return STATUS_NOT_SUPPORTED; case EADDRINUSE: return STATUS_ADDRESS_ALREADY_ASSOCIATED;