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 3f2e27bc784016..48063c26d06045 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 @@ public BufferListReceiveOperation(SocketAsyncContext context) : base(context) { 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 @@ public BufferPtrReceiveOperation(SocketAsyncContext context) : base(context) { } 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 @@ public ReceiveMessageFromOperation(SocketAsyncContext context) : base(context) { 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 @@ public BufferPtrReceiveMessageFromOperation(SocketAsyncContext context) : base(c 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 26b3cf81333b5c..b88eb1375cf919 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 0220f9b3334bbe..14b78aac015339 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; }