diff options
author | Werner Koch <[email protected]> | 2019-11-12 19:29:47 +0000 |
---|---|---|
committer | Werner Koch <[email protected]> | 2019-11-12 19:35:12 +0000 |
commit | 12def3a84e0358528347107dc88cfe740a54941f (patch) | |
tree | 50fa8ff917a26e4dc5f963e03718133d9e0b0896 /dirmngr/http.c | |
parent | dirmngr: Tune down err on missing ldapservers file (diff) | |
download | gnupg-12def3a84e0358528347107dc88cfe740a54941f.tar.gz gnupg-12def3a84e0358528347107dc88cfe740a54941f.zip |
dirmngr: Use IPv4 or IPv6 interface only if available.
* dirmngr/dns-stuff.c (cached_inet_support): New variable.
(dns_stuff_housekeeping): New.
(check_inet_support): New.
* dirmngr/http.c (connect_server): Use only detected interfaces.
* dirmngr/dirmngr.c (housekeeping_thread): Flush the new cache.
--
This currently works only for Windows but that is where users really
ran into problems. The old workaround was to configure disable-ipv4
or disable-ipv6.
Signed-off-by: Werner Koch <[email protected]>
Diffstat (limited to 'dirmngr/http.c')
-rw-r--r-- | dirmngr/http.c | 10 |
1 files changed, 7 insertions, 3 deletions
diff --git a/dirmngr/http.c b/dirmngr/http.c index 8e0701fab..c6dc077da 100644 --- a/dirmngr/http.c +++ b/dirmngr/http.c @@ -2908,7 +2908,7 @@ connect_server (ctrl_t ctrl, const char *server, unsigned short port, unsigned int srvcount = 0; int hostfound = 0; int anyhostaddr = 0; - int srv, connected; + int srv, connected, v4_valid, v6_valid; gpg_error_t last_err = 0; struct srventry *serverlist = NULL; @@ -2918,6 +2918,8 @@ connect_server (ctrl_t ctrl, const char *server, unsigned short port, init_sockets (); #endif /*Windows*/ + check_inet_support (&v4_valid, &v6_valid); + /* Onion addresses require special treatment. */ if (is_onion_address (server)) { @@ -2996,9 +2998,11 @@ connect_server (ctrl_t ctrl, const char *server, unsigned short port, for (ai = aibuf; ai && !connected; ai = ai->next) { - if (ai->family == AF_INET && (flags & HTTP_FLAG_IGNORE_IPv4)) + if (ai->family == AF_INET + && ((flags & HTTP_FLAG_IGNORE_IPv4) || !v4_valid)) continue; - if (ai->family == AF_INET6 && (flags & HTTP_FLAG_IGNORE_IPv6)) + if (ai->family == AF_INET6 + && ((flags & HTTP_FLAG_IGNORE_IPv6) || !v6_valid)) continue; if (sock != ASSUAN_INVALID_FD) |