Fix some issues with peer names being reported. There may be other problems

too.
My read of MSDN is that queries that return addresses in queries other than
TDI_QUERY_ADDRESS_INFO return a TRANSPORT_ADDRESS, so we plumb that through
for GetPeerName.  Note that this isn't user-facing functionality, so it's
unlikely, though not impossible, that we've got it wrong and it'll affect
something.  Likely, this is an improvement.

svn path=/trunk/; revision=40067
This commit is contained in:
Art Yerkes 2009-03-16 20:59:05 +00:00
parent 455369fa90
commit 1c4400b8ae

View file

@ -1507,9 +1507,8 @@ WSPGetSockName(IN SOCKET Handle,
Socket = GetSocketStructure(Handle); Socket = GetSocketStructure(Handle);
/* Allocate a buffer for the address */ /* Allocate a buffer for the address */
TdiAddressSize = FIELD_OFFSET(TDI_ADDRESS_INFO, Address.Address[0].Address) + TdiAddressSize =
Socket->SharedData.SizeOfLocalAddress; sizeof(TRANSPORT_ADDRESS) + Socket->SharedData.SizeOfLocalAddress;
TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize); TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
if ( TdiAddress == NULL ) if ( TdiAddress == NULL )
@ -1578,7 +1577,6 @@ WSPGetPeerName(IN SOCKET s,
{ {
IO_STATUS_BLOCK IOSB; IO_STATUS_BLOCK IOSB;
ULONG TdiAddressSize; ULONG TdiAddressSize;
PTDI_ADDRESS_INFO TdiAddress;
PTRANSPORT_ADDRESS SocketAddress; PTRANSPORT_ADDRESS SocketAddress;
PSOCKET_INFORMATION Socket = NULL; PSOCKET_INFORMATION Socket = NULL;
NTSTATUS Status; NTSTATUS Status;
@ -1597,19 +1595,16 @@ WSPGetPeerName(IN SOCKET s,
Socket = GetSocketStructure(s); Socket = GetSocketStructure(s);
/* Allocate a buffer for the address */ /* Allocate a buffer for the address */
TdiAddressSize = FIELD_OFFSET(TDI_ADDRESS_INFO, Address.Address[0].Address) + TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + *NameLength;
Socket->SharedData.SizeOfLocalAddress; SocketAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize);
if ( TdiAddress == NULL ) if ( SocketAddress == NULL )
{ {
NtClose( SockEvent ); NtClose( SockEvent );
*lpErrno = WSAENOBUFS; *lpErrno = WSAENOBUFS;
return SOCKET_ERROR; return SOCKET_ERROR;
} }
SocketAddress = &TdiAddress->Address;
/* Send IOCTL */ /* Send IOCTL */
Status = NtDeviceIoControlFile((HANDLE)Socket->Handle, Status = NtDeviceIoControlFile((HANDLE)Socket->Handle,
SockEvent, SockEvent,
@ -1619,7 +1614,7 @@ WSPGetPeerName(IN SOCKET s,
IOCTL_AFD_GET_PEER_NAME, IOCTL_AFD_GET_PEER_NAME,
NULL, NULL,
0, 0,
TdiAddress, SocketAddress,
TdiAddressSize); TdiAddressSize);
/* Wait for return */ /* Wait for return */
@ -1643,12 +1638,12 @@ WSPGetPeerName(IN SOCKET s,
AFD_DbgPrint (MID_TRACE, ("NameLength %d Address: %s Port %x\n", AFD_DbgPrint (MID_TRACE, ("NameLength %d Address: %s Port %x\n",
*NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr, *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr,
((struct sockaddr_in *)Name)->sin_port)); ((struct sockaddr_in *)Name)->sin_port));
HeapFree(GlobalHeap, 0, TdiAddress); HeapFree(GlobalHeap, 0, SocketAddress);
return 0; return 0;
} }
else else
{ {
HeapFree(GlobalHeap, 0, TdiAddress); HeapFree(GlobalHeap, 0, SocketAddress);
*lpErrno = WSAEFAULT; *lpErrno = WSAEFAULT;
return SOCKET_ERROR; return SOCKET_ERROR;
} }