Just following up on version 5 of this patch as I haven't heard any feedback (and want to make sure it hasn't been overlooked).
On 16/11/18 10:27 am, Brendan McGrath wrote:
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;