Hans Leidekker : ws2_32: Always return the source address from WSAAccept.
Alexandre Julliard
julliard at winehq.org
Wed Oct 2 15:49:13 CDT 2013
Module: wine
Branch: master
Commit: 1422a56667f1672fa75c3f4126d44d8e7f95e397
URL: http://source.winehq.org/git/wine.git/?a=commit;h=1422a56667f1672fa75c3f4126d44d8e7f95e397
Author: Hans Leidekker <hans at codeweavers.com>
Date: Wed Oct 2 16:07:02 2013 +0200
ws2_32: Always return the source address from WSAAccept.
---
dlls/ws2_32/socket.c | 27 +++++++++++++++------------
dlls/ws2_32/tests/sock.c | 6 +++---
2 files changed, 18 insertions(+), 15 deletions(-)
diff --git a/dlls/ws2_32/socket.c b/dlls/ws2_32/socket.c
index 1d2fbcb..1b1815c 100644
--- a/dlls/ws2_32/socket.c
+++ b/dlls/ws2_32/socket.c
@@ -6555,7 +6555,7 @@ SOCKET WINAPI WSAAccept( SOCKET s, struct WS_sockaddr *addr, LPINT addrlen,
LPCONDITIONPROC lpfnCondition, DWORD_PTR dwCallbackData)
{
- int ret = 0, size = 0;
+ int ret = 0, size;
WSABUF CallerId, CallerData, CalleeId, CalleeData;
/* QOS SQOS, GQOS; */
GROUP g;
@@ -6565,34 +6565,37 @@ SOCKET WINAPI WSAAccept( SOCKET s, struct WS_sockaddr *addr, LPINT addrlen,
TRACE("Socket %04lx, sockaddr %p, addrlen %p, fnCondition %p, dwCallbackData %ld\n",
s, addr, addrlen, lpfnCondition, dwCallbackData);
-
- size = sizeof(src_addr);
- cs = WS_accept(s, &src_addr, &size);
-
+ cs = WS_accept(s, addr, addrlen);
if (cs == SOCKET_ERROR) return SOCKET_ERROR;
-
if (!lpfnCondition) return cs;
- CallerId.buf = (char *)&src_addr;
- CallerId.len = sizeof(src_addr);
-
+ if (addr && addrlen)
+ {
+ CallerId.buf = (char *)addr;
+ CallerId.len = *addrlen;
+ }
+ else
+ {
+ size = sizeof(src_addr);
+ WS_getpeername(cs, &src_addr, &size);
+ CallerId.buf = (char *)&src_addr;
+ CallerId.len = size;
+ }
CallerData.buf = NULL;
CallerData.len = 0;
+ size = sizeof(dst_addr);
WS_getsockname(cs, &dst_addr, &size);
CalleeId.buf = (char *)&dst_addr;
CalleeId.len = sizeof(dst_addr);
-
ret = (*lpfnCondition)(&CallerId, &CallerData, NULL, NULL,
&CalleeId, &CalleeData, &g, dwCallbackData);
switch (ret)
{
case CF_ACCEPT:
- if (addr && addrlen)
- memcpy(addr, &src_addr, (*addrlen > size) ? size : *addrlen );
return cs;
case CF_DEFER:
SERVER_START_REQ( set_socket_deferred )
diff --git a/dlls/ws2_32/tests/sock.c b/dlls/ws2_32/tests/sock.c
index 2cf851f..898ecef 100644
--- a/dlls/ws2_32/tests/sock.c
+++ b/dlls/ws2_32/tests/sock.c
@@ -3246,7 +3246,7 @@ static void test_accept(void)
socklen = 0;
accepted = WSAAccept(server_socket, (struct sockaddr *)&ss, &socklen, NULL, 0);
- todo_wine ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSAEFAULT, "got %d\n", WSAGetLastError());
+ ok(accepted == INVALID_SOCKET && WSAGetLastError() == WSAEFAULT, "got %d\n", WSAGetLastError());
ok(!socklen, "got %d\n", socklen);
closesocket(connector);
connector = INVALID_SOCKET;
@@ -3269,8 +3269,8 @@ static void test_accept(void)
memset(&ss, 0, sizeof(ss));
accepted = WSAAccept(server_socket, (struct sockaddr *)&ss, &socklen, NULL, 0);
ok(accepted != INVALID_SOCKET, "Failed to accept connection, %d\n", WSAGetLastError());
- todo_wine ok(socklen != sizeof(ss), "unexpected length\n");
- todo_wine ok(ss.ss_family, "family not set\n");
+ ok(socklen != sizeof(ss), "unexpected length\n");
+ ok(ss.ss_family, "family not set\n");
closesocket(accepted);
closesocket(connector);
accepted = connector = INVALID_SOCKET;
More information about the wine-cvs
mailing list