diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs index 3f2e27bc784016bbeccc26d7db10d31b096ac9da..48063c26d06045dd91dea74b69800a46aa865e6c 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs @@ -475,9 +475,12 @@ protected override bool DoTryComplete(SocketAsyncContext context) } else { - bool result = SocketPal.TryCompleteReceiveFrom(context._socket, Buffer.Span, null, Flags, SocketAddress.Span, out int socketAddressLen, out BytesTransferred, out ReceivedFlags, out ErrorCode); - SocketAddress = SocketAddress.Slice(0, socketAddressLen); - return result; + bool completed = SocketPal.TryCompleteReceiveFrom(context._socket, Buffer.Span, null, Flags, SocketAddress.Span, out int socketAddressLen, out BytesTransferred, out ReceivedFlags, out ErrorCode); + if (completed && ErrorCode == SocketError.Success) + { + SocketAddress = SocketAddress.Slice(0, socketAddressLen); + } + return completed; } } } @@ -508,7 +511,7 @@ private sealed class BufferListReceiveOperation : ReceiveOperation protected override bool DoTryComplete(SocketAsyncContext context) { bool completed = SocketPal.TryCompleteReceiveFrom(context._socket, default(Span), Buffers, Flags, SocketAddress.Span, out int socketAddressLen, out BytesTransferred, out ReceivedFlags, out ErrorCode); - if (ErrorCode == SocketError.Success) + if (completed && ErrorCode == SocketError.Success) { SocketAddress = SocketAddress.Slice(0, socketAddressLen); } @@ -542,7 +545,7 @@ private sealed unsafe class BufferPtrReceiveOperation : ReceiveOperation protected override bool DoTryComplete(SocketAsyncContext context) { bool completed = SocketPal.TryCompleteReceiveFrom(context._socket, new Span(BufferPtr, Length), null, Flags, SocketAddress.Span, out int socketAddressLen, out BytesTransferred, out ReceivedFlags, out ErrorCode); - if (ErrorCode == SocketError.Success) + if (completed && ErrorCode == SocketError.Success) { SocketAddress = SocketAddress.Slice(0, socketAddressLen); } @@ -569,7 +572,7 @@ private sealed class ReceiveMessageFromOperation : ReadOperation protected override bool DoTryComplete(SocketAsyncContext context) { bool completed = SocketPal.TryCompleteReceiveMessageFrom(context._socket, Buffer.Span, Buffers, Flags, SocketAddress, out int socketAddressLen, IsIPv4, IsIPv6, out BytesTransferred, out ReceivedFlags, out IPPacketInformation, out ErrorCode); - if (ErrorCode == SocketError.Success) + if (completed && ErrorCode == SocketError.Success) { SocketAddress = SocketAddress.Slice(0, socketAddressLen); } @@ -599,7 +602,7 @@ private sealed unsafe class BufferPtrReceiveMessageFromOperation : ReadOperation protected override bool DoTryComplete(SocketAsyncContext context) { bool completed = SocketPal.TryCompleteReceiveMessageFrom(context._socket, new Span(BufferPtr, Length), null, Flags, SocketAddress!, out int socketAddressLen, IsIPv4, IsIPv6, out BytesTransferred, out ReceivedFlags, out IPPacketInformation, out ErrorCode); - if (ErrorCode == SocketError.Success) + if (completed && ErrorCode == SocketError.Success) { SocketAddress = SocketAddress.Slice(0, socketAddressLen); } 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 26b3cf81333b5c24b0e4840d89ab4b169a882c8b..b88eb1375cf919173c352a174ab81545932916d7 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 @@ -368,10 +368,7 @@ private static SocketError FinishOperationConnect() private void UpdateReceivedSocketAddress(SocketAddress socketAddress) { - if (_socketAddressSize > 0) - { - socketAddress.Size = _socketAddressSize; - } + socketAddress.Size = _socketAddressSize; } partial void FinishOperationReceiveMessageFrom(); diff --git a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs index 0220f9b3334bbed1e9396209638e4133edbf1d17..14b78aac015339b9d96facb95e6b843f2ff1278b 100644 --- a/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs +++ b/src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs @@ -152,6 +152,8 @@ private static unsafe int SysReceive(SafeSocketHandle socket, SocketFlags flags, Count = (UIntPtr)buffer.Length }; + Debug.Assert(socketAddress.Length != 0 || sockAddr == null); + var messageHeader = new Interop.Sys.MessageHeader { SocketAddress = sockAddr, SocketAddressLen = socketAddress.Length, @@ -468,7 +470,6 @@ private static unsafe int SysReceive(SafeSocketHandle socket, SocketFlags flags, private static unsafe int SysReceiveMessageFrom(SafeSocketHandle socket, SocketFlags flags, Span buffer, Span socketAddress, out int socketAddressLen, bool isIPv4, bool isIPv6, out SocketFlags receivedFlags, out IPPacketInformation ipPacketInformation, out Interop.Error errno) { Debug.Assert(socket.IsSocket); - Debug.Assert(socketAddress != null, "Expected non-null socketAddress"); int cmsgBufferLen = Interop.Sys.GetControlMessageBufferSize(Convert.ToInt32(isIPv4), Convert.ToInt32(isIPv6)); byte* cmsgBuffer = stackalloc byte[cmsgBufferLen]; @@ -484,6 +485,8 @@ private static unsafe int SysReceiveMessageFrom(SafeSocketHandle socket, SocketF Count = (UIntPtr)buffer.Length }; + Debug.Assert(socketAddress.Length != 0 || rawSocketAddress == null); + messageHeader = new Interop.Sys.MessageHeader { SocketAddress = rawSocketAddress, SocketAddressLen = socketAddress.Length, @@ -1234,7 +1237,7 @@ public static SocketError Receive(SafeSocketHandle handle, IList.Empty, out int _, out bytesTransferred, out _, out errorCode)) { errorCode = SocketError.WouldBlock; }