Zebediah Figura : ws2_32: Pass a Win32 socket address to IOCTL_AFD_WINE_CONNECT.
Alexandre Julliard
julliard at winehq.org
Thu Jun 17 15:38:05 CDT 2021
Module: wine
Branch: master
Commit: 5295cc273e6d963d0abaa0412cdd5b9e75f04687
URL: https://source.winehq.org/git/wine.git/?a=commit;h=5295cc273e6d963d0abaa0412cdd5b9e75f04687
Author: Zebediah Figura <z.figura12 at gmail.com>
Date: Wed Jun 16 23:33:10 2021 -0500
ws2_32: Pass a Win32 socket address to IOCTL_AFD_WINE_CONNECT.
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/ws2_32/socket.c | 54 +++++++++-------------------------------------------
include/wine/afd.h | 2 +-
server/sock.c | 19 +++++++++++++-----
3 files changed, 24 insertions(+), 51 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index c8403808d8f..845a0e68986 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -1959,8 +1959,6 @@ int WINAPI WS_closesocket(SOCKET s)
*/
int WINAPI WS_connect( SOCKET s, const struct WS_sockaddr *addr, int len )
{
- union generic_unix_sockaddr uaddr;
- unsigned int uaddrlen = ws_sockaddr_ws2u( addr, len, &uaddr );
struct afd_connect_params *params;
IO_STATUS_BLOCK io;
HANDLE sync_event;
@@ -1968,35 +1966,19 @@ int WINAPI WS_connect( SOCKET s, const struct WS_sockaddr *addr, int len )
TRACE( "socket %#lx, addr %s, len %d\n", s, debugstr_sockaddr(addr), len );
- if (!uaddrlen)
- {
- SetLastError( WSAEFAULT );
- return -1;
- }
-
- if (addr->sa_family == WS_AF_INET)
- {
- struct sockaddr_in *in4 = (struct sockaddr_in *)&uaddr;
- if (!memcmp(&in4->sin_addr, magic_loopback_addr, sizeof(magic_loopback_addr)))
- {
- TRACE("Replacing magic address 127.12.34.56 with INADDR_LOOPBACK.\n");
- in4->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- }
- }
-
if (!(sync_event = get_sync_event())) return -1;
- if (!(params = HeapAlloc( GetProcessHeap(), 0, sizeof(*params) + uaddrlen )))
+ if (!(params = HeapAlloc( GetProcessHeap(), 0, sizeof(*params) + len )))
{
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return -1;
}
- params->addr_len = uaddrlen;
+ params->addr_len = len;
params->synchronous = TRUE;
- memcpy(params + 1, &uaddr, uaddrlen);
+ memcpy( params + 1, addr, len );
status = NtDeviceIoControlFile( (HANDLE)s, sync_event, NULL, NULL, &io, IOCTL_AFD_WINE_CONNECT,
- params, sizeof(*params) + uaddrlen, NULL, 0);
+ params, sizeof(*params) + len, NULL, 0 );
HeapFree( GetProcessHeap(), 0, params );
if (status == STATUS_PENDING)
{
@@ -2029,8 +2011,6 @@ int WINAPI WSAConnect( SOCKET s, const struct WS_sockaddr* name, int namelen,
static BOOL WINAPI WS2_ConnectEx( SOCKET s, const struct WS_sockaddr *name, int namelen,
void *send_buffer, DWORD send_len, DWORD *ret_len, OVERLAPPED *overlapped )
{
- union generic_unix_sockaddr uaddr;
- unsigned int uaddrlen = ws_sockaddr_ws2u(name, namelen, &uaddr);
struct afd_connect_params *params;
void *cvalue = NULL;
NTSTATUS status;
@@ -2060,35 +2040,19 @@ static BOOL WINAPI WS2_ConnectEx( SOCKET s, const struct WS_sockaddr *name, int
overlapped->Internal = STATUS_PENDING;
overlapped->InternalHigh = 0;
- if (!uaddrlen)
- {
- SetLastError( WSAEFAULT );
- return SOCKET_ERROR;
- }
-
- if (name->sa_family == WS_AF_INET)
- {
- struct sockaddr_in *in4 = (struct sockaddr_in *)&uaddr;
- if (!memcmp( &in4->sin_addr, magic_loopback_addr, sizeof(magic_loopback_addr) ))
- {
- TRACE("Replacing magic address 127.12.34.56 with INADDR_LOOPBACK.\n");
- in4->sin_addr.s_addr = htonl(INADDR_LOOPBACK);
- }
- }
-
- if (!(params = HeapAlloc( GetProcessHeap(), 0, sizeof(*params) + uaddrlen + send_len )))
+ if (!(params = HeapAlloc( GetProcessHeap(), 0, sizeof(*params) + namelen + send_len )))
{
SetLastError( ERROR_NOT_ENOUGH_MEMORY );
return SOCKET_ERROR;
}
- params->addr_len = uaddrlen;
+ params->addr_len = namelen;
params->synchronous = FALSE;
- memcpy( params + 1, &uaddr, uaddrlen );
- memcpy( (char *)(params + 1) + uaddrlen, send_buffer, send_len );
+ memcpy( params + 1, name, namelen );
+ memcpy( (char *)(params + 1) + namelen, send_buffer, send_len );
status = NtDeviceIoControlFile( SOCKET2HANDLE(s), overlapped->hEvent, NULL, cvalue,
(IO_STATUS_BLOCK *)overlapped, IOCTL_AFD_WINE_CONNECT,
- params, sizeof(*params) + uaddrlen + send_len, NULL, 0 );
+ params, sizeof(*params) + namelen + send_len, NULL, 0 );
HeapFree( GetProcessHeap(), 0, params );
if (ret_len) *ret_len = overlapped->InternalHigh;
SetLastError( NtStatusToWSAError( status ) );
diff --git a/include/wine/afd.h b/include/wine/afd.h
index 04468363673..19c1e064aaf 100644
--- a/include/wine/afd.h
+++ b/include/wine/afd.h
@@ -173,7 +173,7 @@ struct afd_connect_params
{
int addr_len;
int synchronous;
- /* VARARG(addr, struct sockaddr, addr_len); */
+ /* VARARG(addr, struct WS(sockaddr), addr_len); */
/* VARARG(data, bytes); */
};
diff --git a/server/sock.c b/server/sock.c
index 39575b22f76..88f6e4ac9fd 100644
--- a/server/sock.c
+++ b/server/sock.c
@@ -109,6 +109,8 @@
#define IP_UNICAST_IF 50
#endif
+static const char magic_loopback_addr[] = {127, 12, 34, 56};
+
union win_sockaddr
{
struct WS_sockaddr addr;
@@ -2109,8 +2111,8 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
case IOCTL_AFD_WINE_CONNECT:
{
const struct afd_connect_params *params = get_req_data();
+ const struct WS_sockaddr *addr;
union unix_sockaddr unix_addr;
- const struct sockaddr *addr;
struct connect_req *req;
socklen_t unix_len;
int send_len, ret;
@@ -2122,7 +2124,7 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
return 0;
}
send_len = get_req_data_size() - sizeof(*params) - params->addr_len;
- addr = (const struct sockaddr *)(params + 1);
+ addr = (const struct WS_sockaddr *)(params + 1);
if (sock->accept_recv_req)
{
@@ -2144,7 +2146,16 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
return 0;
}
- ret = connect( unix_fd, addr, params->addr_len );
+ unix_len = sockaddr_to_unix( addr, params->addr_len, &unix_addr );
+ if (!unix_len)
+ {
+ set_error( STATUS_INVALID_ADDRESS );
+ return 0;
+ }
+ if (unix_addr.addr.sa_family == AF_INET && !memcmp( &unix_addr.in.sin_addr, magic_loopback_addr, 4 ))
+ unix_addr.in.sin_addr.s_addr = htonl( INADDR_LOOPBACK );
+
+ ret = connect( unix_fd, &unix_addr.addr, unix_len );
if (ret < 0 && errno != EINPROGRESS)
{
set_error( sock_get_ntstatus( errno ) );
@@ -2427,8 +2438,6 @@ static int sock_ioctl( struct fd *fd, ioctl_code_t code, struct async *async )
if (unix_addr.addr.sa_family == WS_AF_INET)
{
- static const char magic_loopback_addr[] = {127, 12, 34, 56};
-
if (!memcmp( &unix_addr.in.sin_addr, magic_loopback_addr, 4 )
|| bind_to_interface( sock, &unix_addr.in ))
bind_addr.in.sin_addr.s_addr = htonl( INADDR_ANY );
More information about the wine-cvs
mailing list