Fix Socket.ReceiveFrom on Unix (#46151)
authorAnton Firszov <Anton.Firszov@microsoft.com>
Wed, 6 Jan 2021 12:22:48 +0000 (13:22 +0100)
committerGitHub <noreply@github.com>
Wed, 6 Jan 2021 12:22:48 +0000 (13:22 +0100)
Fix a regression within the sync-over-async blocking path within the Unix ReceiveFrom implementation.

src/libraries/System.Net.Sockets/src/System/Net/Sockets/SocketAsyncContext.Unix.cs
src/libraries/System.Net.Sockets/tests/FunctionalTests/SendReceive/SendReceive.cs
src/libraries/System.Net.Sockets/tests/FunctionalTests/SendReceive/SendReceiveNonParallel.cs
src/libraries/System.Net.Sockets/tests/FunctionalTests/SocketTestHelper.cs

index 343c9c9..4202cdb 100644 (file)
@@ -1505,6 +1505,7 @@ namespace System.Net.Sockets
             {
                 Buffer = buffer,
                 Flags = flags,
+                SetReceivedFlags = true,
                 SocketAddress = socketAddress,
                 SocketAddressLen = socketAddressLen,
             };
index dfef96e..a96680a 100644 (file)
@@ -873,6 +873,7 @@ namespace System.Net.Sockets.Tests
                 var socket = new Socket(address.AddressFamily, SocketType.Dgram, ProtocolType.Udp);
                 if (address.IsIPv4MappedToIPv6) socket.DualMode = true;
                 socket.BindToAnonymousPort(address);
+                ConfigureNonBlocking(socket);
 
                 Task receiveTask = ReceiveAsync(socket, new ArraySegment<byte>(new byte[1]));
 
index 02cb9a0..634d0f4 100644 (file)
@@ -40,6 +40,10 @@ namespace System.Net.Sockets.Tests
             using var left = useClone ? new Socket(origLeft.SafeHandle) : origLeft;
             using var right = useClone ? new Socket(origRight.SafeHandle) : origRight;
 
+            // Force non-blocking mode in ...SyncForceNonBlocking variants of the test: 
+            ConfigureNonBlocking(left);
+            ConfigureNonBlocking(right);
+
             var leftEndpoint = (IPEndPoint)left.LocalEndPoint;
             var rightEndpoint = (IPEndPoint)right.LocalEndPoint;
 
index 41fa116..b6ff517 100644 (file)
@@ -41,6 +41,7 @@ namespace System.Net.Sockets.Tests
         public virtual bool SupportsAcceptIntoExistingSocket => true;
         public virtual bool SupportsAcceptReceive => false;
         public virtual void Listen(Socket s, int backlog) { s.Listen(backlog); }
+        public virtual void ConfigureNonBlocking(Socket s) { }
     }
 
     public class SocketHelperArraySync : SocketHelperBase
@@ -91,6 +92,7 @@ namespace System.Net.Sockets.Tests
             s.Listen(backlog);
             s.ForceNonBlocking(true);
         }
+        public override void ConfigureNonBlocking(Socket s) => s.ForceNonBlocking(true);
     }
 
     public sealed class SocketHelperApm : SocketHelperBase
@@ -345,6 +347,7 @@ namespace System.Net.Sockets.Tests
         public bool SupportsAcceptIntoExistingSocket => _socketHelper.SupportsAcceptIntoExistingSocket;
         public bool SupportsAcceptReceive => _socketHelper.SupportsAcceptReceive;
         public void Listen(Socket s, int backlog) => _socketHelper.Listen(s, backlog);
+        public void ConfigureNonBlocking(Socket s) => _socketHelper.ConfigureNonBlocking(s);
     }
 
     public class SocketHelperSpanSync : SocketHelperArraySync
@@ -364,6 +367,7 @@ namespace System.Net.Sockets.Tests
             Task.Run(() => { s.ForceNonBlocking(true); Socket accepted = s.Accept(); accepted.ForceNonBlocking(true); return accepted; });
         public override Task ConnectAsync(Socket s, EndPoint endPoint) =>
             Task.Run(() => { s.ForceNonBlocking(true); s.Connect(endPoint); });
+        public override void ConfigureNonBlocking(Socket s) => s.ForceNonBlocking(true);
     }
 
     public sealed class SocketHelperMemoryArrayTask : SocketHelperTask