summaryrefslogtreecommitdiff
path: root/srclib/apr/network_io/unix/sockets.c
diff options
context:
space:
mode:
authorStefan Fritsch <sf@sfritsch.de>2011-12-27 19:43:09 +0100
committerStefan Fritsch <sf@sfritsch.de>2011-12-27 19:43:09 +0100
commit5b56d06a01a150fc9685e6f913774be3f9deb49f (patch)
tree9fbfbe0313b782941f1c2c4d3cb5203817144108 /srclib/apr/network_io/unix/sockets.c
parent498ea95018b369e62646a98c7d7d5413b56e170c (diff)
downloadapache2-5b56d06a01a150fc9685e6f913774be3f9deb49f.tar.gz
Upstream tarball 2.2.19upstream/2.2.19
Diffstat (limited to 'srclib/apr/network_io/unix/sockets.c')
-rw-r--r--srclib/apr/network_io/unix/sockets.c25
1 files changed, 18 insertions, 7 deletions
diff --git a/srclib/apr/network_io/unix/sockets.c b/srclib/apr/network_io/unix/sockets.c
index 5552460e..748dd707 100644
--- a/srclib/apr/network_io/unix/sockets.c
+++ b/srclib/apr/network_io/unix/sockets.c
@@ -222,7 +222,13 @@ apr_status_t apr_socket_accept(apr_socket_t **new, apr_socket_t *sock,
}
#endif
alloc_socket(new, connection_context);
- set_socket_vars(*new, sock->local_addr->sa.sin.sin_family, SOCK_STREAM, sock->protocol);
+
+ /* Set up socket variables -- note that it may be possible for
+ * *new to be an AF_INET socket when sock is AF_INET6 in some
+ * dual-stack configurations, so ensure that the remote_/local_addr
+ * structures are adjusted for the family of the accepted
+ * socket: */
+ set_socket_vars(*new, sa.sa.sin.sin_family, SOCK_STREAM, sock->protocol);
#ifndef HAVE_POLL
(*new)->connected = 1;
@@ -338,18 +344,18 @@ apr_status_t apr_socket_connect(apr_socket_t *sock, apr_sockaddr_t *sa)
#endif /* SO_ERROR */
}
- if (rc == -1 && errno != EISCONN) {
- return errno;
- }
if (memcmp(sa->ipaddr_ptr, generic_inaddr_any, sa->ipaddr_len)) {
/* A real remote address was passed in. If the unspecified
* address was used, the actual remote addr will have to be
* determined using getpeername() if required. */
- /* ### this should probably be a structure copy + fixup as per
- * _accept()'s handling of local_addr */
- sock->remote_addr = sa;
sock->remote_addr_unknown = 0;
+
+ /* Copy the address structure details in. */
+ sock->remote_addr->sa = sa->sa;
+ sock->remote_addr->salen = sa->salen;
+ /* Adjust ipaddr_ptr et al. */
+ apr_sockaddr_vars_set(sock->remote_addr, sa->family, sa->port);
}
if (sock->local_addr->port == 0) {
@@ -364,6 +370,11 @@ apr_status_t apr_socket_connect(apr_socket_t *sock, apr_sockaddr_t *sa)
*/
sock->local_interface_unknown = 1;
}
+
+ if (rc == -1 && errno != EISCONN) {
+ return errno;
+ }
+
#ifndef HAVE_POLL
sock->connected=1;
#endif