diff options
| author | Alexander Barton <alex@barton.de> | 2011-04-26 12:04:22 +0200 |
|---|---|---|
| committer | Alexander Barton <alex@barton.de> | 2011-04-26 12:04:22 +0200 |
| commit | 1cb2f5739d867502c45cad1c8edfa4c5dcd47933 (patch) | |
| tree | 91fcdd64ba8f0c5c975cbb2e5f94592fd5264172 /src | |
| parent | 66315cab9aaf6f9c2acf9fae86f577dc8a30da23 (diff) | |
| parent | 160f5725a6646d432f70fe8b677ffdbcbdeb02ce (diff) | |
| download | ngircd-1cb2f5739d867502c45cad1c8edfa4c5dcd47933.tar.gz ngircd-1cb2f5739d867502c45cad1c8edfa4c5dcd47933.zip | |
Merge branch 'master' of git://arthur.barton.de/ngircd-alex
* 'master' of git://arthur.barton.de/ngircd-alex: Do reverse lookups using the AF of the incoming connection resolve: fix reverse lookups of client connections with ConnectIPv6=no
Diffstat (limited to 'src')
| -rw-r--r-- | src/ngircd/resolve.c | 32 |
1 files changed, 17 insertions, 15 deletions
diff --git a/src/ngircd/resolve.c b/src/ngircd/resolve.c index 9aeb68e3..9b17af9c 100644 --- a/src/ngircd/resolve.c +++ b/src/ngircd/resolve.c @@ -236,7 +236,7 @@ ReverseLookup(const ng_ipaddr_t *IpAddr, char *resbuf, size_t reslen) * @return true if lookup successful, false if domain name not found */ static bool -ForwardLookup(const char *hostname, array *IpAddr) +ForwardLookup(const char *hostname, array *IpAddr, int af) { ng_ipaddr_t addr; @@ -245,23 +245,13 @@ ForwardLookup(const char *hostname, array *IpAddr) struct addrinfo *a, *ai_results; static struct addrinfo hints; -#ifndef WANT_IPV6 - hints.ai_family = AF_INET; -#endif #ifdef AI_ADDRCONFIG /* glibc has this, but not e.g. netbsd 4.0 */ hints.ai_flags = AI_ADDRCONFIG; #endif hints.ai_socktype = SOCK_STREAM; hints.ai_protocol = IPPROTO_TCP; + hints.ai_family = af; -#ifdef WANT_IPV6 - assert(Conf_ConnectIPv6 || Conf_ConnectIPv4); - - if (!Conf_ConnectIPv6) - hints.ai_family = AF_INET; - if (!Conf_ConnectIPv4) - hints.ai_family = AF_INET6; -#endif memset(&addr, 0, sizeof(addr)); res = getaddrinfo(hostname, NULL, &hints, &ai_results); @@ -390,7 +380,7 @@ Do_ResolveAddr(const ng_ipaddr_t *Addr, int identsock, int w_fd) if (!ReverseLookup(Addr, hostname, sizeof(hostname))) goto dns_done; - if (ForwardLookup(hostname, &resolved_addr)) { + if (ForwardLookup(hostname, &resolved_addr, ng_ipaddr_af(Addr))) { if (!Addr_in_list(&resolved_addr, Addr)) { Log_Forgery_WrongIP(tmp_ip_str, hostname); strlcpy(hostname, tmp_ip_str, sizeof(hostname)); @@ -427,6 +417,7 @@ Do_ResolveName( const char *Host, int w_fd ) /* Resolver sub-process: resolve name and write result into pipe * to parent. */ array IpAddrs; + int af; #ifdef DEBUG ng_ipaddr_t *addr; size_t len; @@ -434,8 +425,19 @@ Do_ResolveName( const char *Host, int w_fd ) Log_Subprocess(LOG_DEBUG, "Now resolving \"%s\" ...", Host); array_init(&IpAddrs); - /* Resolve hostname */ - if (!ForwardLookup(Host, &IpAddrs)) { + +#ifdef WANT_IPV6 + af = AF_UNSPEC; + assert(Conf_ConnectIPv6 || Conf_ConnectIPv4); + + if (!Conf_ConnectIPv6) + af = AF_INET; + if (!Conf_ConnectIPv4) + af = AF_INET6; +#else + af = AF_INET; +#endif + if (!ForwardLookup(Host, &IpAddrs, af)) { close(w_fd); return; } |