From 7e8f6635c9f42f552111ec56435ffc91d12e2f73 Mon Sep 17 00:00:00 2001 From: wfurt Date: Fri, 27 Sep 2024 08:45:30 -0700 Subject: [PATCH 1/3] guard agains empty Accept address --- .../System.Net.Sockets/src/System/Net/Sockets/Socket.cs | 4 ++-- .../src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs index e1f19c03d6d0ad..817a8221d6bf0f 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/Socket.cs @@ -3602,7 +3602,7 @@ internal void InternalSetBlocking(bool desired) } // CreateAcceptSocket - pulls unmanaged results and assembles them into a new Socket object. - internal Socket CreateAcceptSocket(SafeSocketHandle fd, EndPoint remoteEP) + internal Socket CreateAcceptSocket(SafeSocketHandle fd, EndPoint? remoteEP) { // Internal state of the socket is inherited from listener. Debug.Assert(fd != null && !fd.IsInvalid); @@ -3610,7 +3610,7 @@ internal Socket CreateAcceptSocket(SafeSocketHandle fd, EndPoint remoteEP) return UpdateAcceptSocket(socket, remoteEP); } - internal Socket UpdateAcceptSocket(Socket socket, EndPoint remoteEP) + internal Socket UpdateAcceptSocket(Socket socket, EndPoint? remoteEP) { // Internal state of the socket is inherited from listener. socket._addressFamily = _addressFamily; diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs index bcb411922ae05e..600fc28bacb450 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs @@ -350,7 +350,7 @@ private SocketError FinishOperationAccept(SocketAddress remoteSocketAddress) Socket acceptedSocket = _currentSocket!.CreateAcceptSocket( SocketPal.CreateSocket(_acceptedFileDescriptor), - _currentSocket._rightEndPoint!.Create(remoteSocketAddress)); + remoteSocketAddress.Size > 0 ? _currentSocket._rightEndPoint!.Create(remoteSocketAddress) : null); if (_acceptSocket is null) { // Store the accepted socket From f459b34706c0d2aaff922593d5a8c0c7d29ec3a4 Mon Sep 17 00:00:00 2001 From: wfurt Date: Tue, 1 Oct 2024 09:01:03 -0700 Subject: [PATCH 2/3] remove assert --- .../src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs | 1 - 1 file changed, 1 deletion(-) diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs index 600fc28bacb450..13931d953c4608 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs @@ -35,7 +35,6 @@ private void CompleteAcceptOperation(IntPtr acceptedFileDescriptor, Memory _acceptedFileDescriptor = acceptedFileDescriptor; if (socketError == SocketError.Success) { - Debug.Assert(socketAddress.Length > 0); _acceptAddressBufferCount = socketAddress.Length; } else From 34e0a13ef051837270fb345d684e1b26c3f6358c Mon Sep 17 00:00:00 2001 From: wfurt Date: Tue, 22 Oct 2024 09:42:54 -0700 Subject: [PATCH 3/3] add comment --- .../src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs index 13931d953c4608..088fb07ca46d23 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs @@ -347,6 +347,7 @@ private SocketError FinishOperationAccept(SocketAddress remoteSocketAddress) new ReadOnlySpan(_acceptBuffer, 0, _acceptAddressBufferCount).CopyTo(remoteSocketAddress.Buffer.Span); remoteSocketAddress.Size = _acceptAddressBufferCount; + // on macOS accept can sometimes return empty remote address even when it returns successfully. Socket acceptedSocket = _currentSocket!.CreateAcceptSocket( SocketPal.CreateSocket(_acceptedFileDescriptor), remoteSocketAddress.Size > 0 ? _currentSocket._rightEndPoint!.Create(remoteSocketAddress) : null);