[PATCH v5] ws2_32: Return WSAEAFNOSUPPORT when ip4/6 disabled

Brendan McGrath brendan at redmandi.com
Thu Nov 15 17:27:43 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 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;
-- 
2.17.1




More information about the wine-devel mailing list