summaryrefslogtreecommitdiff
path: root/network_io
diff options
context:
space:
mode:
authorMladen Turk <mturk@apache.org>2006-09-11 09:30:21 +0000
committerMladen Turk <mturk@apache.org>2006-09-11 09:30:21 +0000
commite043b6ac33eb2cb316ae644cdbdd05b1ef823ca9 (patch)
treeecf6d49d7f0563ea763ed6985b1ce8a2a5754e4e /network_io
parent339d53cb716fe68287eacbfffd17e7cfd2c9c4f3 (diff)
downloadapr-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.c29
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