aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-08-12 14:48:16 +0000
committerCorinna Vinschen <corinna@vinschen.de>2009-08-12 14:48:16 +0000
commita73a3f438bd75c84ab2f6eb2a27a9b5064b7af9c (patch)
tree42e9604566e58ee77c3d23c943648bed26480ad0
parent91dd009e81c3f1934a65f46b39b5a653c8be7fa4 (diff)
downloadnewlib-a73a3f438bd75c84ab2f6eb2a27a9b5064b7af9c.zip
newlib-a73a3f438bd75c84ab2f6eb2a27a9b5064b7af9c.tar.gz
newlib-a73a3f438bd75c84ab2f6eb2a27a9b5064b7af9c.tar.bz2
* 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.
-rw-r--r--winsup/cygwin/ChangeLog7
-rw-r--r--winsup/cygwin/fhandler_socket.cc27
2 files changed, 16 insertions, 18 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 8af4f6c..bea140e 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,10 @@
+2009-08-12 Corinna Vinschen <corinna@vinschen.de>
+
+ * 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.
+
2009-08-11 Corinna Vinschen <corinna@vinschen.de>
* include/limits.h (NGROUPS_MAX): Set to a more sane value.
diff --git a/winsup/cygwin/fhandler_socket.cc b/winsup/cygwin/fhandler_socket.cc
index 472fe62..71e4bde 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
{