diff options
author | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2000-12-14 18:42:38 +0000 |
---|---|---|
committer | trawick <trawick@13f79535-47bb-0310-9956-ffa450edef68> | 2000-12-14 18:42:38 +0000 |
commit | c771e9b1329117eebfcedb6449008c8c125dbbfc (patch) | |
tree | c6ec0b64a9ffef4eb8e13deb7478055b17e596a3 /network_io | |
parent | c59371f75297eda48500102127f20416022b19c3 (diff) | |
download | libapr-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.c | 9 | ||||
-rw-r--r-- | network_io/win32/sockets.c | 9 |
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 :) */ |