From: Eric Covener Date: Sat, 24 Mar 2018 14:52:31 +0000 (+0000) Subject: copy apr_sockaddr_is_wildcard to maintain 1.4.x support. X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=f7d1532af9555d0bc196805d87502a57adbf691d;p=apache copy apr_sockaddr_is_wildcard to maintain 1.4.x support. git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/trunk@1827654 13f79535-47bb-0310-9956-ffa450edef68 --- diff --git a/modules/metadata/mod_remoteip.c b/modules/metadata/mod_remoteip.c index 891db08c15..d4f710425e 100644 --- a/modules/metadata/mod_remoteip.c +++ b/modules/metadata/mod_remoteip.c @@ -31,6 +31,7 @@ #define APR_WANT_BYTEFUNC #include "apr_want.h" #include "apr_network_io.h" +#include "apr_version.h" module AP_MODULE_DECLARE_DATA remoteip_module; @@ -314,6 +315,40 @@ static int remoteip_sockaddr_equal(apr_sockaddr_t *addr1, apr_sockaddr_t *addr2) return (addr1->port == addr2->port && apr_sockaddr_equal(addr1, addr2)); } +#if !APR_VERSION_AT_LEAST(1,5,0) +#define apr_sockaddr_is_wildcard sockaddr_is_wildcard +/* XXX: temp build fix from apr 1.5.x */ +static int sockaddr_is_wildcard(const apr_sockaddr_t *addr) +{ + static const char inaddr_any[ +#if APR_HAVE_IPV6 + sizeof(struct in6_addr) +#else + sizeof(struct in_addr) +#endif + ] = {0}; + + if (addr->ipaddr_ptr /* IP address initialized */ + && addr->ipaddr_len <= sizeof inaddr_any) { /* else bug elsewhere? */ + if (!memcmp(inaddr_any, addr->ipaddr_ptr, addr->ipaddr_len)) { + return 1; + } +#if APR_HAVE_IPV6 + if (addr->family == AF_INET6 + && IN6_IS_ADDR_V4MAPPED((struct in6_addr *)addr->ipaddr_ptr)) { + struct in_addr *v4 = (struct in_addr *)&((apr_uint32_t *)addr->ipaddr_ptr)[3]; + + if (!memcmp(inaddr_any, v4, sizeof *v4)) { + return 1; + } + } +#endif + } + return 0; +} +#endif + + /** Similar to remoteip_sockaddr_equal, except that it handles wildcard addresses * and ports too. */