Author: cgutman
Date: Tue Jul 12 21:31:36 2011
New Revision: 52667

URL: http://svn.reactos.org/svn/reactos?rev=52667&view=rev
Log:
[IP]
- Store the address of an outgoing NIC properly (gethostname() fix)
- Don't do an explicit bind if we don't have to (ws2_32_winetest sock hang fix)

Modified:
    trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
    trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c

Modified: trunk/reactos/lib/drivers/ip/transport/tcp/accept.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/tcp/accept.c?rev=52667&r1=52666&r2=52667&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/accept.c [iso-8859-1] Tue Jul 12 
21:31:36 2011
@@ -78,25 +78,36 @@
     TI_DbgPrint(DEBUG_TCP,("Connection->SocketContext %x\n",
     Connection->SocketContext));
 
-    AddressToBind.sin_family = AF_INET;
-    memcpy( &AddressToBind.sin_addr,
-        &Connection->AddressFile->Address.Address.IPv4Address,
-        sizeof(AddressToBind.sin_addr) );
-    AddressToBind.sin_port = Connection->AddressFile->Port;
+    if (Connection->AddressFile->Port)
+    {
+        AddressToBind.sin_family = AF_INET;
+        memcpy( &AddressToBind.sin_addr,
+               &Connection->AddressFile->Address.Address.IPv4Address,
+               sizeof(AddressToBind.sin_addr) );
+        AddressToBind.sin_port = Connection->AddressFile->Port;
+        TI_DbgPrint(DEBUG_TCP,("AddressToBind - %x:%x\n", 
AddressToBind.sin_addr, AddressToBind.sin_port));
 
-    TI_DbgPrint(DEBUG_TCP,("AddressToBind - %x:%x\n", AddressToBind.sin_addr, 
AddressToBind.sin_port));
+        /* Perform an explicit bind */
+        Status = TCPTranslateError(OskitTCPBind(Connection->SocketContext,
+                                                &AddressToBind,
+                                                sizeof(AddressToBind)));
+    }
+    else
+    {
+        /* An implicit bind will be performed */
+        Status = STATUS_SUCCESS;
+    }
 
-    Status = TCPTranslateError( OskitTCPBind( Connection->SocketContext,
-                        &AddressToBind,
-                        sizeof(AddressToBind) ) );
+    if (NT_SUCCESS(Status))
+        Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, 
Backlog ) );
+    
     if (NT_SUCCESS(Status))
     {
         /* Check if we had an unspecified port */
         if (!Connection->AddressFile->Port)
         {
             /* We did, so we need to copy back the port */
-            Status = TCPGetSockAddress(Connection, 
(PTRANSPORT_ADDRESS)&LocalAddress, FALSE);
-            if (NT_SUCCESS(Status))
+            if (NT_SUCCESS(TCPGetSockAddress(Connection, 
(PTRANSPORT_ADDRESS)&LocalAddress, FALSE)))
             {
                 /* Allocate the port in the port bitmap */
                 Connection->AddressFile->Port = 
TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
@@ -106,9 +117,6 @@
             }
         }
     }
-
-    if (NT_SUCCESS(Status))
-        Status = TCPTranslateError( OskitTCPListen( Connection->SocketContext, 
Backlog ) );
 
     UnlockObject(Connection, OldIrql);
 

Modified: trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c?rev=52667&r1=52666&r2=52667&view=diff
==============================================================================
--- trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] (original)
+++ trunk/reactos/lib/drivers/ip/transport/tcp/tcp.c [iso-8859-1] Tue Jul 12 
21:31:36 2011
@@ -723,7 +723,7 @@
     USHORT RemotePort;
     TA_IP_ADDRESS LocalAddress;
     PTDI_BUCKET Bucket;
-    PNEIGHBOR_CACHE_ENTRY NCE;
+    PNEIGHBOR_CACHE_ENTRY NCE = NULL;
     KIRQL OldIrql;
 
     TI_DbgPrint(DEBUG_TCP,("TCPConnect: Called\n"));
@@ -762,37 +762,36 @@
             UnlockObject(Connection, OldIrql);
             return STATUS_NETWORK_UNREACHABLE;
         }
-
-        AddressToBind.sin_addr.s_addr = 
NCE->Interface->Unicast.Address.IPv4Address;
+    }
+
+    if (Connection->AddressFile->Port)
+    {
+        /* See if we had an unspecified bind address */
+        if (NCE)
+        {
+            /* We did, so use the interface unicast address associated with 
the route */
+            AddressToBind.sin_addr.s_addr = 
NCE->Interface->Unicast.Address.IPv4Address;
+        }
+        else
+        {
+            /* Bind address was explicit so use it */
+            AddressToBind.sin_addr.s_addr = 
Connection->AddressFile->Address.Address.IPv4Address;
+        }
+        
+        AddressToBind.sin_port = Connection->AddressFile->Port;
+        
+        /* Perform an explicit bind */
+        Status = TCPTranslateError(OskitTCPBind(Connection->SocketContext,
+                                                &AddressToBind,
+                                                sizeof(AddressToBind)));
     }
     else
     {
-        AddressToBind.sin_addr.s_addr = 
Connection->AddressFile->Address.Address.IPv4Address;
-    }
-    
-    AddressToBind.sin_port = Connection->AddressFile->Port;
-
-    Status = TCPTranslateError
-        ( OskitTCPBind( Connection->SocketContext,
-                        &AddressToBind,
-                        sizeof(AddressToBind) ) );
-
-    if (NT_SUCCESS(Status)) {
-        /* Check if we had an unspecified port */
-        if (!Connection->AddressFile->Port)
-        {
-            /* We did, so we need to copy back the port */
-            Status = TCPGetSockAddress(Connection, 
(PTRANSPORT_ADDRESS)&LocalAddress, FALSE);
-            if (NT_SUCCESS(Status))
-            {
-                /* Allocate the port in the port bitmap */
-                Connection->AddressFile->Port = 
TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
-                    
-                /* This should never fail */
-                ASSERT(Connection->AddressFile->Port != 0xFFFF);
-            }
-        }
-        
+        /* An implicit bind will be performed */
+        Status = STATUS_SUCCESS;
+    }
+
+    if (NT_SUCCESS(Status)) {        
         if (NT_SUCCESS(Status))
         {
             memcpy( &AddressToConnect.sin_addr,
@@ -804,7 +803,31 @@
             ( OskitTCPConnect( Connection->SocketContext,
                               &AddressToConnect,
                               sizeof(AddressToConnect) ) );
-            
+
+            if (NT_SUCCESS(Status))
+            {
+                /* Check if we had an unspecified port */
+                if (!Connection->AddressFile->Port)
+                {
+                    /* We did, so we need to copy back the port */
+                    if (NT_SUCCESS(TCPGetSockAddress(Connection, 
(PTRANSPORT_ADDRESS)&LocalAddress, FALSE)))
+                    {
+                        /* Allocate the port in the port bitmap */
+                        Connection->AddressFile->Port = 
TCPAllocatePort(LocalAddress.Address[0].Address[0].sin_port);
+
+                        /* This should never fail */
+                        ASSERT(Connection->AddressFile->Port != 0xFFFF);
+                    }
+                }
+                
+                /* Check if the address was unspecified */
+                if (AddrIsUnspecified(&Connection->AddressFile->Address))
+                {
+                    /* It is, so store the address of the outgoing NIC */
+                    Connection->AddressFile->Address = NCE->Interface->Unicast;
+                }
+            }
+
             if (Status == STATUS_PENDING)
             {
                 Bucket = ExAllocatePoolWithTag( NonPagedPool, sizeof(*Bucket), 
TDI_BUCKET_TAG );


Reply via email to