summaryrefslogtreecommitdiff
path: root/network_io
diff options
context:
space:
mode:
authortrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2000-12-14 18:42:38 +0000
committertrawick <trawick@13f79535-47bb-0310-9956-ffa450edef68>2000-12-14 18:42:38 +0000
commitc771e9b1329117eebfcedb6449008c8c125dbbfc (patch)
treec6ec0b64a9ffef4eb8e13deb7478055b17e596a3 /network_io
parentc59371f75297eda48500102127f20416022b19c3 (diff)
downloadlibapr-c771e9b1329117eebfcedb6449008c8c125dbbfc.tar.gz
Fix a bug in apr_accept() for Win32 and Unix where the local
apr_sockaddr_t in the new connected socket was not initialized properly. This could result in a bad string for apr_get_ipaddr(), among other things. git-svn-id: http://svn.apache.org/repos/asf/apr/apr/trunk@60952 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'network_io')
-rw-r--r--network_io/unix/sockets.c9
-rw-r--r--network_io/win32/sockets.c9
2 files changed, 18 insertions, 0 deletions
diff --git a/network_io/unix/sockets.c b/network_io/unix/sockets.c
index 9f4cd6b20..13c721be8 100644
--- a/network_io/unix/sockets.c
+++ b/network_io/unix/sockets.c
@@ -205,6 +205,15 @@ apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *conn
return errno;
}
*(*new)->local_addr = *sock->local_addr;
+ /* fix up any pointers which are no longer valid */
+ if (sock->local_addr->sa.sin.sin_family == AF_INET) {
+ (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin.sin_addr;
+ }
+#if APR_HAVE_IPV6
+ else if (sock->local_addr->sa.sin.sin_family == AF_INET6) {
+ (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin6.sin6_addr;
+ }
+#endif
if (sock->local_port_unknown) {
/* not likely for a listening socket, but theoretically possible :) */
diff --git a/network_io/win32/sockets.c b/network_io/win32/sockets.c
index 0aed50f27..7cff92122 100644
--- a/network_io/win32/sockets.c
+++ b/network_io/win32/sockets.c
@@ -232,6 +232,15 @@ apr_status_t apr_accept(apr_socket_t **new, apr_socket_t *sock, apr_pool_t *conn
return apr_get_netos_error();
}
*(*new)->local_addr = *sock->local_addr;
+ /* fix up any pointers which are no longer valid */
+ if (sock->local_addr->sa.sin.sin_family == AF_INET) {
+ (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin.sin_addr;
+ }
+#if APR_HAVE_IPV6
+ else if (sock->local_addr->sa.sin.sin_family == AF_INET6) {
+ (*new)->local_addr->ipaddr_ptr = &(*new)->local_addr->sa.sin6.sin6_addr;
+ }
+#endif
if (sock->local_port_unknown) {
/* not likely for a listening socket, but theoretically possible :) */