diff options
author | Mladen Turk <mturk@apache.org> | 2006-09-11 09:30:21 +0000 |
---|---|---|
committer | Mladen Turk <mturk@apache.org> | 2006-09-11 09:30:21 +0000 |
commit | e043b6ac33eb2cb316ae644cdbdd05b1ef823ca9 (patch) | |
tree | ecf6d49d7f0563ea763ed6985b1ce8a2a5754e4e /network_io | |
parent | 339d53cb716fe68287eacbfffd17e7cfd2c9c4f3 (diff) | |
download | apr-e043b6ac33eb2cb316ae644cdbdd05b1ef823ca9.tar.gz |
Do not allocate new socket if accept fails.
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@442135 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'network_io')
-rw-r--r-- | network_io/unix/sockets.c | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/network_io/unix/sockets.c b/network_io/unix/sockets.c index 6d24cdcf0..a37984d7d 100644 --- a/network_io/unix/sockets.c +++ b/network_io/unix/sockets.c @@ -176,30 +176,35 @@ apr_status_t apr_socket_listen(apr_socket_t *sock, apr_int32_t backlog) apr_status_t apr_socket_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *connection_context) { - alloc_socket(new, connection_context); - set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM, sock->protocol); + int s; + apr_sockaddr_t sa; -#ifndef HAVE_POLL - (*new)->connected = 1; -#endif - (*new)->timeout = -1; - - (*new)->socketdes = accept(sock->socketdes, - (struct sockaddr *)&(*new)->remote_addr->sa, - &(*new)->remote_addr->salen); + apr_sockaddr_vars_set(&sa, sock->local_addr->sa.sin.sin_family, 0); + sa.pool = connection_context; + s = accept(sock->socketdes, (struct sockaddr *)&sa.sa, &sa.salen); - if ((*new)->socketdes < 0) { + if (s < 0) { return errno; } #ifdef TPF - if ((*new)->socketdes == 0) { + if (s == 0) { /* 0 is an invalid socket for TPF */ return APR_EINTR; } #endif + alloc_socket(new, connection_context); + set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM, sock->protocol); + +#ifndef HAVE_POLL + (*new)->connected = 1; +#endif + (*new)->timeout = -1; (*new)->remote_addr_unknown = 0; + (*new)->socketdes = s; + *(*new)->remote_addr = sa; + *(*new)->local_addr = *sock->local_addr; /* The above assignment just overwrote the pool entry. Setting the local_addr |