Skip to content

Commit

Permalink
Add support for apr < 1.5.
Browse files Browse the repository at this point in the history
apr_sockaddr_is_wildcard() was introduced in apr 1.5, but some systems
are still running earlier versions. So for those we provide an
implementation ourselves, which is a direct copy-paste of the
implementation in apr >= 1.5.

This closes issue roadrunner2#7 and obsoletes pull request roadrunner2#4.

Thanks to mamanguy and earsdown for initial patch suggestions.
  • Loading branch information
roadrunner2 committed Jul 15, 2017
1 parent 62d2df6 commit 0b6c6f6
Showing 1 changed file with 32 additions and 0 deletions.
32 changes: 32 additions & 0 deletions mod_proxy_protocol.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@
#include "ap_config.h"
#include "ap_listen.h"
#include "apr_strings.h"
#include "apr_version.h"

module AP_MODULE_DECLARE_DATA proxy_protocol_module;

Expand Down Expand Up @@ -79,6 +80,37 @@ static int pp_hook_pre_config(apr_pool_t *pconf, apr_pool_t *plog,
return OK;
}

#if !(APR_VERSION_AT_LEAST(1,5,0))
static APR_DECLARE(int) apr_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 apr_sockaddr_equal, except that it compares ports too. */
static int pp_sockaddr_equal(apr_sockaddr_t *addr1, apr_sockaddr_t *addr2)
{
Expand Down

0 comments on commit 0b6c6f6

Please sign in to comment.