* 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.
This commit is contained in:
Corinna Vinschen 2009-08-12 14:48:16 +00:00
parent 91dd009e81
commit a73a3f438b
2 changed files with 16 additions and 18 deletions

View File

@ -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> 2009-08-11 Corinna Vinschen <corinna@vinschen.de>
* include/limits.h (NGROUPS_MAX): Set to a more sane value. * include/limits.h (NGROUPS_MAX): Set to a more sane value.

View File

@ -1117,27 +1117,13 @@ int
fhandler_socket::accept (struct sockaddr *peer, int *len) fhandler_socket::accept (struct sockaddr *peer, int *len)
{ {
/* Allows NULL peer and len parameters. */ /* Allows NULL peer and len parameters. */
struct sockaddr_in peer_dummy; struct sockaddr_storage lpeer;
int len_dummy; int llen = sizeof (struct sockaddr_storage);
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);
int res = 0; int res = 0;
while (!(res = wait_for_events (FD_ACCEPT | FD_CLOSE)) 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) && WSAGetLastError () == WSAEWOULDBLOCK)
; ;
if (res == (int) INVALID_SOCKET) 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->wsock_events->owner = wsock_events->owner;
sock->connect_state (connected); sock->connect_state (connected);
res = res_fd; res = res_fd;
if (peer)
{
*len = min (*len, llen);
memcpy (peer, &lpeer, *len);
}
} }
else else
{ {