Fix RemoteEndpoint with async+DualMode (#4717)
authorMikayla Hutchinson <m.j.hutchinson@gmail.com>
Wed, 19 Apr 2017 09:48:41 +0000 (05:48 -0400)
committerMarek Safar <marek.safar@gmail.com>
Wed, 19 Apr 2017 09:48:41 +0000 (11:48 +0200)
mcs/class/System/System.Net.Sockets/Socket.cs
mcs/class/System/Test/System.Net.Sockets/SocketTest.cs

index 4d5d7b418496bad939a53f2b25840d4031ebb150..89911c426b4420c4cc944c0dea38db8850a40204 100644 (file)
@@ -901,12 +901,11 @@ namespace System.Net.Sockets
                                SocketAsyncResult ares;
 
                                if (!GetCheckedIPs (e, out addresses)) {
-                                       e.socket_async_result.EndPoint = e.RemoteEndPoint;
+                                       //NOTE: DualMode may cause Socket's RemoteEndpoint to differ in AddressFamily from the
+                                       // SocketAsyncEventArgs, but the SocketAsyncEventArgs itself is not changed
                                        ares = (SocketAsyncResult) BeginConnect (e.RemoteEndPoint, ConnectAsyncCallback, e);
                                } else {
-                                       DnsEndPoint dep = (e.RemoteEndPoint as DnsEndPoint);
-                                       e.socket_async_result.Addresses = addresses;
-                                       e.socket_async_result.Port = dep.Port;
+                                       DnsEndPoint dep = (DnsEndPoint)e.RemoteEndPoint;
                                        ares = (SocketAsyncResult) BeginConnect (addresses, dep.Port, ConnectAsyncCallback, e);
                                }
 
@@ -984,8 +983,8 @@ namespace System.Net.Sockets
                                        sockares.Complete (new SocketException ((int) SocketError.AddressNotAvailable), true);
                                        return sockares;
                                }
-                               
-                               remoteEP = RemapIPEndPoint (ep);
+
+                               sockares.EndPoint = remoteEP = RemapIPEndPoint (ep);
                        }
 
                        int error = 0;
index 6e82f9d6db81626de695abee6c8d6a34496b8425..6e80da7dc78d1035425e9a6208d4f5902b685a92 100755 (executable)
@@ -4620,6 +4620,8 @@ namespace MonoTests.System.Net.Sockets
                                client.DualMode = true;
                                var ar1 = client.BeginConnect (ep, BCCallback, client);
                                Assert.IsTrue (BCCalledBack.WaitOne (10000), "#1");
+                               Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#2");
+                               Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#3");
                                client.Disconnect (false);
                                client.Close ();
 
@@ -4627,7 +4629,9 @@ namespace MonoTests.System.Net.Sockets
                                client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
                                client.DualMode = true;
                                var ar2 = client.BeginConnect (IPAddress.Loopback, ep.Port, BCCallback, client);
-                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
+                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#4");
+                               Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#5");
+                               Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#6");
                                client.Disconnect (false);
                                client.Close ();
 
@@ -4635,7 +4639,9 @@ namespace MonoTests.System.Net.Sockets
                                client = new Socket (AddressFamily.InterNetworkV6, SocketType.Stream, ProtocolType.Tcp);
                                client.DualMode = true;
                                var ar3 = client.BeginConnect (new [] {IPAddress.Loopback}, ep.Port, BCCallback, client);
-                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#2");
+                               Assert.IsTrue (BCCalledBack.WaitOne (10000), "#7");
+                               Assert.AreEqual(server.AddressFamily, client.RemoteEndPoint.AddressFamily, "#8");
+                               Assert.AreEqual(server.AddressFamily, client.LocalEndPoint.AddressFamily, "#9");
                                client.Disconnect (false);
                                client.Close();
                        }