From 1c4400b8ae7ec6c77dfcc4b0737b8c7b6f8f93a5 Mon Sep 17 00:00:00 2001 From: Art Yerkes Date: Mon, 16 Mar 2009 20:59:05 +0000 Subject: [PATCH] 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 --- reactos/dll/win32/msafd/misc/dllmain.c | 23 +++++++++-------------- 1 file changed, 9 insertions(+), 14 deletions(-) diff --git a/reactos/dll/win32/msafd/misc/dllmain.c b/reactos/dll/win32/msafd/misc/dllmain.c index 7883efe5f5a..1ad46ee909f 100644 --- a/reactos/dll/win32/msafd/misc/dllmain.c +++ b/reactos/dll/win32/msafd/misc/dllmain.c @@ -1488,7 +1488,7 @@ WSPGetSockName(IN SOCKET Handle, { IO_STATUS_BLOCK IOSB; ULONG TdiAddressSize; - PTDI_ADDRESS_INFO TdiAddress; + PTDI_ADDRESS_INFO TdiAddress; PTRANSPORT_ADDRESS SocketAddress; PSOCKET_INFORMATION Socket = NULL; NTSTATUS Status; @@ -1507,9 +1507,8 @@ WSPGetSockName(IN SOCKET Handle, Socket = GetSocketStructure(Handle); /* Allocate a buffer for the address */ - TdiAddressSize = FIELD_OFFSET(TDI_ADDRESS_INFO, Address.Address[0].Address) + - Socket->SharedData.SizeOfLocalAddress; - + TdiAddressSize = + sizeof(TRANSPORT_ADDRESS) + Socket->SharedData.SizeOfLocalAddress; TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize); if ( TdiAddress == NULL ) @@ -1578,7 +1577,6 @@ WSPGetPeerName(IN SOCKET s, { IO_STATUS_BLOCK IOSB; ULONG TdiAddressSize; - PTDI_ADDRESS_INFO TdiAddress; PTRANSPORT_ADDRESS SocketAddress; PSOCKET_INFORMATION Socket = NULL; NTSTATUS Status; @@ -1597,19 +1595,16 @@ WSPGetPeerName(IN SOCKET s, Socket = GetSocketStructure(s); /* Allocate a buffer for the address */ - TdiAddressSize = FIELD_OFFSET(TDI_ADDRESS_INFO, Address.Address[0].Address) + - Socket->SharedData.SizeOfLocalAddress; - TdiAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize); + TdiAddressSize = sizeof(TRANSPORT_ADDRESS) + *NameLength; + SocketAddress = HeapAlloc(GlobalHeap, 0, TdiAddressSize); - if ( TdiAddress == NULL ) + if ( SocketAddress == NULL ) { NtClose( SockEvent ); *lpErrno = WSAENOBUFS; return SOCKET_ERROR; } - SocketAddress = &TdiAddress->Address; - /* Send IOCTL */ Status = NtDeviceIoControlFile((HANDLE)Socket->Handle, SockEvent, @@ -1619,7 +1614,7 @@ WSPGetPeerName(IN SOCKET s, IOCTL_AFD_GET_PEER_NAME, NULL, 0, - TdiAddress, + SocketAddress, TdiAddressSize); /* Wait for return */ @@ -1643,12 +1638,12 @@ WSPGetPeerName(IN SOCKET s, AFD_DbgPrint (MID_TRACE, ("NameLength %d Address: %s Port %x\n", *NameLength, ((struct sockaddr_in *)Name)->sin_addr.s_addr, ((struct sockaddr_in *)Name)->sin_port)); - HeapFree(GlobalHeap, 0, TdiAddress); + HeapFree(GlobalHeap, 0, SocketAddress); return 0; } else { - HeapFree(GlobalHeap, 0, TdiAddress); + HeapFree(GlobalHeap, 0, SocketAddress); *lpErrno = WSAEFAULT; return SOCKET_ERROR; }