From 21ae0216f3b7f73a05b747b2f332a4fb08ea3e8e Mon Sep 17 00:00:00 2001 From: wfurt Date: Wed, 9 Aug 2023 17:13:43 -0700 Subject: [PATCH 1/5] only slice SocketAddress on success operation --- .../src/System/Net/Sockets/SocketAsyncContext.Unix.cs | 5 ++++- .../src/System/Net/Sockets/SocketAsyncEventArgs.Unix.cs | 5 +---- 2 files changed, 5 insertions(+), 5 deletions(-) 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..5db36575278ab8 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 @@ -476,7 +476,10 @@ 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); + if (ErrorCode == SocketError.Success) + { + SocketAddress = SocketAddress.Slice(0, socketAddressLen); + } return result; } } 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(); From df0a58914b076f138890b85601752435b46b4ac0 Mon Sep 17 00:00:00 2001 From: wfurt Date: Wed, 9 Aug 2023 23:26:29 -0700 Subject: [PATCH 2/5] null --- .../src/System/Net/Sockets/SocketPal.Unix.cs | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) 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..01b976f890335c 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,11 @@ private static unsafe int SysReceive(SafeSocketHandle socket, SocketFlags flags, Count = (UIntPtr)buffer.Length }; + if (socketAddress.Length == 0) + { + Debug.Assert(sockAddr == null); + } + var messageHeader = new Interop.Sys.MessageHeader { SocketAddress = sockAddr, SocketAddressLen = socketAddress.Length, @@ -468,7 +473,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 +488,11 @@ private static unsafe int SysReceiveMessageFrom(SafeSocketHandle socket, SocketF Count = (UIntPtr)buffer.Length }; + if (socketAddress.Length == 0) + { + Debug.Assert(rawSocketAddress == null); + } + messageHeader = new Interop.Sys.MessageHeader { SocketAddress = rawSocketAddress, SocketAddressLen = socketAddress.Length, @@ -1234,7 +1243,7 @@ public static SocketError Receive(SafeSocketHandle handle, IList.Empty, out int _, out bytesTransferred, out _, out errorCode)) { errorCode = SocketError.WouldBlock; } From c08a263e6cc19774bfd48045541e21f651aa9fe1 Mon Sep 17 00:00:00 2001 From: wfurt Date: Thu, 10 Aug 2023 11:54:24 -0700 Subject: [PATCH 3/5] completed --- .../System/Net/Sockets/SocketAsyncContext.Unix.cs | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) 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 5db36575278ab8..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,12 +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); - if (ErrorCode == SocketError.Success) + 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 result; + return completed; } } } @@ -511,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); } @@ -545,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); } @@ -572,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); } @@ -602,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); } From f6e6ed63943a08be7d3c966c07de414bb126113b Mon Sep 17 00:00:00 2001 From: wfurt Date: Thu, 10 Aug 2023 11:55:40 -0700 Subject: [PATCH 4/5] feedback --- .../src/System/Net/Sockets/SocketPal.Unix.cs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) 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 01b976f890335c..a9b44195edbb2b 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,10 +152,7 @@ private static unsafe int SysReceive(SafeSocketHandle socket, SocketFlags flags, Count = (UIntPtr)buffer.Length }; - if (socketAddress.Length == 0) - { - Debug.Assert(sockAddr == null); - } + Debug.Assert(socketAddress.Length != 0 || rawSocketAddress == null); var messageHeader = new Interop.Sys.MessageHeader { SocketAddress = sockAddr, @@ -488,10 +485,7 @@ private static unsafe int SysReceiveMessageFrom(SafeSocketHandle socket, SocketF Count = (UIntPtr)buffer.Length }; - if (socketAddress.Length == 0) - { - Debug.Assert(rawSocketAddress == null); - } + Debug.Assert(socketAddress.Length != 0 || rawSocketAddress == null); messageHeader = new Interop.Sys.MessageHeader { SocketAddress = rawSocketAddress, From 2d3d8a30e0cfddba372f0aecb4cbaf0d2cc9d8b6 Mon Sep 17 00:00:00 2001 From: wfurt Date: Thu, 10 Aug 2023 13:27:41 -0700 Subject: [PATCH 5/5] feedback --- .../System.Net.Sockets/src/System/Net/Sockets/SocketPal.Unix.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 a9b44195edbb2b..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,7 +152,7 @@ private static unsafe int SysReceive(SafeSocketHandle socket, SocketFlags flags, Count = (UIntPtr)buffer.Length }; - Debug.Assert(socketAddress.Length != 0 || rawSocketAddress == null); + Debug.Assert(socketAddress.Length != 0 || sockAddr == null); var messageHeader = new Interop.Sys.MessageHeader { SocketAddress = sockAddr,