From 3fa9e5724821cd93aa37659f7be8edb475f1f155 Mon Sep 17 00:00:00 2001 From: Max Lv Date: Sun, 10 Mar 2019 07:40:07 +0800 Subject: [PATCH] Refine ipv6only handling --- src/local.c | 8 ++++++-- src/netutils.c | 14 +++++++------- src/netutils.h | 2 +- src/redir.c | 8 ++++++-- src/server.c | 2 +- src/tunnel.c | 8 ++++++-- 6 files changed, 27 insertions(+), 15 deletions(-) diff --git a/src/local.c b/src/local.c index 949053eb..d998fd33 100644 --- a/src/local.c +++ b/src/local.c @@ -1708,7 +1708,7 @@ main(int argc, char **argv) FATAL("failed to find a free port"); } snprintf(tmp_port, 8, "%d", port); - if (is_ipv6only(remote_addr, remote_num)) { + if (is_ipv6only(remote_addr, remote_num, ipv6first)) { plugin_host = "::1"; } else { plugin_host = "127.0.0.1"; @@ -1748,7 +1748,11 @@ main(int argc, char **argv) #endif if (local_addr == NULL) { - local_addr = "127.0.0.1"; + if (is_ipv6only(remote_addr, remote_num, ipv6first)) { + local_addr = "::1"; + } else { + local_addr = "127.0.0.1"; + } } USE_SYSLOG(argv[0], pid_flags); diff --git a/src/netutils.c b/src/netutils.c index 6bc14c72..f18fcd98 100644 --- a/src/netutils.c +++ b/src/netutils.c @@ -285,17 +285,17 @@ validate_hostname(const char *hostname, const int hostname_len) } int -is_ipv6only(ss_addr_t *servers, size_t server_num) +is_ipv6only(ss_addr_t *servers, size_t server_num, int ipv6first) { - struct cork_ip ip; int i; for (i = 0; i < server_num; i++) { - if (cork_ip_init(&ip, servers[i].host) != -1) { - if (ip.version != 6) { - return 0; - } - } else { + struct sockaddr_storage storage; + memset(&storage, 0, sizeof(struct sockaddr_storage)); + if (get_sockaddr(servers[i].host, servers[i].port, &storage, 1, ipv6first) == -1) { + FATAL("failed to resolve the provided hostname"); + } + if (storage.ss_family != AF_INET6) { return 0; } } diff --git a/src/netutils.h b/src/netutils.h index f7f6dc6b..70664f13 100644 --- a/src/netutils.h +++ b/src/netutils.h @@ -108,6 +108,6 @@ int sockaddr_cmp_addr(struct sockaddr_storage *addr1, int validate_hostname(const char *hostname, const int hostname_len); -int is_ipv6only(ss_addr_t *servers, size_t server_num); +int is_ipv6only(ss_addr_t *servers, size_t server_num, int ipv6first); #endif diff --git a/src/redir.c b/src/redir.c index f5af00bb..a21bf4e3 100644 --- a/src/redir.c +++ b/src/redir.c @@ -1067,7 +1067,7 @@ main(int argc, char **argv) FATAL("failed to find a free port"); } snprintf(tmp_port, 8, "%d", port); - if (is_ipv6only(remote_addr, remote_num)) { + if (is_ipv6only(remote_addr, remote_num, ipv6first)) { plugin_host = "::1"; } else { plugin_host = "127.0.0.1"; @@ -1099,7 +1099,11 @@ main(int argc, char **argv) #endif if (local_addr == NULL) { - local_addr = "127.0.0.1"; + if (is_ipv6only(remote_addr, remote_num, ipv6first)) { + local_addr = "::1"; + } else { + local_addr = "127.0.0.1"; + } } if (fast_open == 1) { diff --git a/src/server.c b/src/server.c index c00d5146..1f0467c5 100644 --- a/src/server.c +++ b/src/server.c @@ -1835,7 +1835,7 @@ main(int argc, char **argv) exit(EXIT_FAILURE); } - if (is_ipv6only(server_addr, server_num)) { + if (is_ipv6only(server_addr, server_num, ipv6first)) { plugin_host = "::1"; } else { plugin_host = "127.0.0.1"; diff --git a/src/tunnel.c b/src/tunnel.c index b55b895a..ae9244e6 100644 --- a/src/tunnel.c +++ b/src/tunnel.c @@ -1116,7 +1116,7 @@ main(int argc, char **argv) FATAL("failed to find a free port"); } snprintf(tmp_port, 8, "%d", port); - if (is_ipv6only(remote_addr, remote_num)) { + if (is_ipv6only(remote_addr, remote_num, ipv6first)) { plugin_host = "::1"; } else { plugin_host = "127.0.0.1"; @@ -1156,7 +1156,11 @@ main(int argc, char **argv) #endif if (local_addr == NULL) { - local_addr = "127.0.0.1"; + if (is_ipv6only(remote_addr, remote_num, ipv6first)) { + local_addr = "::1"; + } else { + local_addr = "127.0.0.1"; + } } if (fast_open == 1) {