Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-08-12 18:48:16 +0400
committerCorinna Vinschen <corinna@vinschen.de>2009-08-12 18:48:16 +0400
commita73a3f438bd75c84ab2f6eb2a27a9b5064b7af9c (patch)
tree42e9604566e58ee77c3d23c943648bed26480ad0 /winsup/cygwin/fhandler_socket.cc
parent91dd009e81c3f1934a65f46b39b5a653c8be7fa4 (diff)
* fhandler_socket.cc (fhandler_socket::accept): Always use local
sockaddr_storage to store peer address and copy over to incoming peer address if available. Truncate data as necessary according to POSIX.
Diffstat (limited to 'winsup/cygwin/fhandler_socket.cc')
-rw-r--r--winsup/cygwin/fhandler_socket.cc27
1 files changed, 9 insertions, 18 deletions
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index 472fe6237..71e4bde4d 100644
--- a/winsup/cygwin/fhandler_socket.cc
+++ b/winsup/cygwin/fhandler_socket.cc
@@ -1117,27 +1117,13 @@ int
fhandler_socket::accept (struct sockaddr *peer, int *len)
{
/* Allows NULL peer and len parameters. */
- struct sockaddr_in peer_dummy;
- int len_dummy;
- if (!peer)
- peer = (struct sockaddr *) &peer_dummy;
- if (!len)
- {
- len_dummy = sizeof (struct sockaddr_in);
- len = &len_dummy;
- }
-
- /* accept on NT fails if len < sizeof (sockaddr_in)
- * some programs set len to
- * sizeof (name.sun_family) + strlen (name.sun_path) for UNIX domain
- */
- if (len && ((unsigned) *len < sizeof (struct sockaddr_in)))
- *len = sizeof (struct sockaddr_in);
-
+ struct sockaddr_storage lpeer;
+ int llen = sizeof (struct sockaddr_storage);
int res = 0;
while (!(res = wait_for_events (FD_ACCEPT | FD_CLOSE))
- && (res = ::accept (get_socket (), peer, len)) == SOCKET_ERROR
+ && (res = ::accept (get_socket (), (struct sockaddr *) &lpeer, &llen))
+ == SOCKET_ERROR
&& WSAGetLastError () == WSAEWOULDBLOCK)
;
if (res == (int) INVALID_SOCKET)
@@ -1175,6 +1161,11 @@ fhandler_socket::accept (struct sockaddr *peer, int *len)
sock->wsock_events->owner = wsock_events->owner;
sock->connect_state (connected);
res = res_fd;
+ if (peer)
+ {
+ *len = min (*len, llen);
+ memcpy (peer, &lpeer, *len);
+ }
}
else
{