aboutsummaryrefslogtreecommitdiffstats
path: root/epan/addr_resolv.c
diff options
context:
space:
mode:
authorJoão Valverde <joao.valverde@tecnico.ulisboa.pt>2016-03-26 03:16:17 +0000
committerAnders Broman <a.broman58@gmail.com>2016-04-04 06:49:55 +0000
commite005bc819c201c49cf330a2607ad0770f145904e (patch)
treeaaff654c2682c3bde08440b5d9526deee1e033c5 /epan/addr_resolv.c
parent1cf7834b2d16f549c6145e5d36b8b7dd7a384223 (diff)
Remove synchronous DNS name resolution
Change-Id: Ie5e670b769eb0674950f3679ef511047641c2873 Reviewed-on: https://code.wireshark.org/review/14751 Petri-Dish: João Valverde <j@v6e.pt> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Alexis La Goutte <alexis.lagoutte@gmail.com> Reviewed-by: Anders Broman <a.broman58@gmail.com>
Diffstat (limited to 'epan/addr_resolv.c')
-rw-r--r--epan/addr_resolv.c235
1 files changed, 43 insertions, 192 deletions
diff --git a/epan/addr_resolv.c b/epan/addr_resolv.c
index ec3a7df9b3..7d541c29d2 100644
--- a/epan/addr_resolv.c
+++ b/epan/addr_resolv.c
@@ -284,7 +284,6 @@ e_addr_resolve gbl_resolv_flags = {
TRUE, /* mac_name */
FALSE, /* network_name */
FALSE, /* transport_name */
- TRUE, /* concurrent_dns */
TRUE, /* dns_pkt_addr_resolution */
TRUE, /* use_external_net_name_resolver */
FALSE, /* load_hosts_file_from_profile_only */
@@ -318,7 +317,6 @@ gchar *g_pvlan_path = NULL; /* personal vlans file */
* ares_gethostbyaddr().
* The callback processes the response, then frees the request.
*/
-#define ASYNC_DNS
typedef struct _async_dns_queue_msg
{
union {
@@ -343,9 +341,7 @@ static void c_ares_ghba_cb(void *arg, int status, int timeouts _U_, struct hoste
ares_channel ghba_chan; /* ares_gethostbyaddr -- Usually non-interactive, no timeout */
ares_channel ghbn_chan; /* ares_gethostbyname -- Usually interactive, timeout */
-#endif /* HAVE_C_ARES */
-#ifdef ASYNC_DNS
static gboolean async_dns_initialized = FALSE;
static guint async_dns_in_flight = 0;
static GList *async_dns_queue_head = NULL;
@@ -361,7 +357,7 @@ add_async_dns_ipv4(int type, guint32 addr)
msg->addr.ip4 = addr;
async_dns_queue_head = g_list_append(async_dns_queue_head, (gpointer) msg);
}
-#endif /* ASYNC_DNS */
+#endif /* HAVE_C_ARES */
typedef struct {
guint32 mask;
@@ -798,69 +794,29 @@ host_lookup(const guint addr)
*/
tp = new_ipv4(addr);
g_hash_table_insert(ipv4_hash_table, GUINT_TO_POINTER(addr), tp);
- } else {
- if ((tp->flags & DUMMY_AND_RESOLVE_FLGS) == DUMMY_ADDRESS_ENTRY) {
- /*
- * This hasn't been resolved yet, and we haven't tried to
- * resolve it already, so try.
- */
- goto try_resolv;
- }
+ } else if ((tp->flags & DUMMY_AND_RESOLVE_FLGS) != DUMMY_ADDRESS_ENTRY) {
return tp;
}
-try_resolv:
- if (gbl_resolv_flags.network_name && gbl_resolv_flags.use_external_net_name_resolver) {
- tp->flags |= TRIED_RESOLVE_ADDRESS;
-
-#ifdef ASYNC_DNS
- if (gbl_resolv_flags.concurrent_dns &&
- name_resolve_concurrency > 0 &&
- async_dns_initialized) {
- add_async_dns_ipv4(AF_INET, addr);
- fill_dummy_ip4(addr, tp);
- return tp;
- }
+ /*
+ * This hasn't been resolved yet, and we haven't tried to
+ * resolve it already.
+ */
- /*
- * The Windows "gethostbyaddr()" insists on translating 0.0.0.0 to
- * the name of the host on which it's running; to work around that
- * botch, we don't try to translate an all-zero IP address to a host
- * name.
- *
- * Presumably getaddrinfo() behaves the same way. Anyway, we should
- * never get to this code on Windows since those builds include c-ares.
- */
-#elif defined(HAVE_GETADDRINFO)
- if (addr != 0) {
- struct sockaddr_in sin;
-
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_addr.s_addr = addr;
- if (getnameinfo((struct sockaddr *)&sin, sizeof(sin),
- tp->name, sizeof(tp->name),
- NULL, 0, NI_NAMEREQD) == 0) {
- return tp;
- }
- }
-#elif defined(HAVE_GETHOSTBYNAME)
- if (addr != 0) {
- struct hostent *hostp;
+ fill_dummy_ip4(addr, tp);
+ if (!gbl_resolv_flags.network_name)
+ return tp;
- hostp = gethostbyaddr((const char *)&addr, 4, AF_INET);
+ if (gbl_resolv_flags.use_external_net_name_resolver) {
+ tp->flags |= TRIED_RESOLVE_ADDRESS;
- if (hostp != NULL && hostp->h_name[0] != '\0') {
- g_strlcpy(tp->name, hostp->h_name, MAXNAMELEN);
- return tp;
- }
+#ifdef HAVE_C_ARES
+ if (async_dns_initialized && name_resolve_concurrency > 0) {
+ add_async_dns_ipv4(AF_INET, addr);
}
#endif
-
- /* unknown host or DNS timeout */
}
- fill_dummy_ip4(addr, tp);
return tp;
} /* host_lookup */
@@ -884,10 +840,6 @@ host_lookup6(const struct e_in6_addr *addr)
hashipv6_t * volatile tp;
#ifdef HAVE_C_ARES
async_dns_queue_msg_t *caqm;
-#elif defined(HAVE_GETADDRINFO)
- struct sockaddr_in6 sin6;
-#elif defined(HAVE_GETHOSTBYNAME)
- struct hostent *hostp;
#endif
tp = (hashipv6_t *)g_hash_table_lookup(ipv6_hash_table, addr);
@@ -902,54 +854,31 @@ host_lookup6(const struct e_in6_addr *addr)
tp = new_ipv6(addr);
memcpy(addr_key, addr, 16);
g_hash_table_insert(ipv6_hash_table, addr_key, tp);
- } else {
- if ((tp->flags & DUMMY_AND_RESOLVE_FLGS) == DUMMY_ADDRESS_ENTRY) {
- /*
- * This hasn't been resolved yet, and we haven't tried to
- * resolve it already, so try.
- */
- goto try_resolv;
- }
+ } else if ((tp->flags & DUMMY_AND_RESOLVE_FLGS) != DUMMY_ADDRESS_ENTRY) {
return tp;
}
-try_resolv:
- if (gbl_resolv_flags.network_name &&
- gbl_resolv_flags.use_external_net_name_resolver) {
+ /*
+ * This hasn't been resolved yet, and we haven't tried to
+ * resolve it already.
+ */
+
+ fill_dummy_ip6(tp);
+ if (!gbl_resolv_flags.network_name)
+ return tp;
+
+ if (gbl_resolv_flags.use_external_net_name_resolver) {
tp->flags |= TRIED_RESOLVE_ADDRESS;
#ifdef HAVE_C_ARES
- if ((gbl_resolv_flags.concurrent_dns) &&
- name_resolve_concurrency > 0 &&
- async_dns_initialized) {
+ if (async_dns_initialized && name_resolve_concurrency > 0) {
caqm = g_new(async_dns_queue_msg_t,1);
caqm->family = AF_INET6;
memcpy(&caqm->addr.ip6, addr, sizeof(caqm->addr.ip6));
async_dns_queue_head = g_list_append(async_dns_queue_head, (gpointer) caqm);
- fill_dummy_ip6(tp);
- return tp;
- }
-#elif defined(HAVE_GETADDRINFO)
- memset(&sin6, 0, sizeof(sin6));
- sin6.sin6_family = AF_INET6;
- memcpy(sin6.sin6_addr.s6_addr, addr, sizeof(*addr));
- if (getnameinfo((struct sockaddr *)&sin6, sizeof(sin6),
- tp->name, sizeof(tp->name),
- NULL, 0, NI_NAMEREQD) == 0) {
- return tp;
- }
-#elif defined(HAVE_GETHOSTBYNAME)
- /* Quick hack to avoid DNS/YP timeout */
- hostp = gethostbyaddr((const char *)addr, sizeof(*addr), AF_INET6);
-
- if (hostp != NULL && hostp->h_name[0] != '\0') {
- g_strlcpy(tp->name, hostp->h_name, MAXNAMELEN);
- return tp;
}
#endif
}
- /* unknown host or DNS timeout */
- fill_dummy_ip6(tp);
return tp;
} /* host_lookup6 */
@@ -2461,6 +2390,7 @@ addr_resolve_pref_init(module_t *nameres)
"Whether address/name pairs found in captured DNS packets should be used by Wireshark for name resolution.",
&gbl_resolv_flags.dns_pkt_addr_resolution);
+#ifdef HAVE_C_ARES
prefs_register_bool_preference(nameres, "use_external_name_resolver",
"Use an external network name resolver",
"Use your system's configured name resolver"
@@ -2469,13 +2399,7 @@ addr_resolve_pref_init(module_t *nameres)
" is enabled.",
&gbl_resolv_flags.use_external_net_name_resolver);
-#ifdef HAVE_C_ARES
- prefs_register_bool_preference(nameres, "concurrent_dns",
- "Enable concurrent DNS name resolution",
- "Enable concurrent DNS name resolution. Only"
- " applies when network name resolution is"
- " enabled. You probably want to enable this.",
- &gbl_resolv_flags.concurrent_dns);
+ prefs_register_obsolete_preference(nameres, "concurrent_dns");
prefs_register_uint_preference(nameres, "name_resolve_concurrency",
"Maximum concurrent requests",
@@ -2486,9 +2410,9 @@ addr_resolve_pref_init(module_t *nameres)
10,
&name_resolve_concurrency);
#else
- prefs_register_static_text_preference(nameres, "concurrent_dns",
- "Enable concurrent DNS name resolution: N/A",
- "Support for concurrent DNS name resolution was not"
+ prefs_register_static_text_preference(nameres, "use_external_name_resolver",
+ "Use an external network name resolver: N/A",
+ "Support for using a concurrent external name resolver was not"
" compiled into this version of Wireshark");
#endif
@@ -2514,7 +2438,6 @@ disable_name_resolution(void) {
gbl_resolv_flags.mac_name = FALSE;
gbl_resolv_flags.network_name = FALSE;
gbl_resolv_flags.transport_name = FALSE;
- gbl_resolv_flags.concurrent_dns = FALSE;
gbl_resolv_flags.dns_pkt_addr_resolution = FALSE;
gbl_resolv_flags.use_external_net_name_resolver = FALSE;
gbl_resolv_flags.vlan_name = FALSE;
@@ -2758,17 +2681,15 @@ host_name_lookup_init(void)
}
g_free(hostspath);
#ifdef HAVE_C_ARES
- if (gbl_resolv_flags.concurrent_dns) {
#ifdef CARES_HAVE_ARES_LIBRARY_INIT
- if (ares_library_init(ARES_LIB_INIT_ALL) == ARES_SUCCESS) {
+ if (ares_library_init(ARES_LIB_INIT_ALL) == ARES_SUCCESS) {
#endif
- if (ares_init(&ghba_chan) == ARES_SUCCESS && ares_init(&ghbn_chan) == ARES_SUCCESS) {
- async_dns_initialized = TRUE;
- }
-#ifdef CARES_HAVE_ARES_LIBRARY_INIT
+ if (ares_init(&ghba_chan) == ARES_SUCCESS && ares_init(&ghbn_chan) == ARES_SUCCESS) {
+ async_dns_initialized = TRUE;
}
-#endif
+#ifdef CARES_HAVE_ARES_LIBRARY_INIT
}
+#endif
#else
#endif /* HAVE_C_ARES */
@@ -3195,10 +3116,6 @@ get_host_ipaddr(const char *host, guint32 *addrp)
int nfds;
fd_set rfds, wfds;
async_hostent_t ahe;
-#elif defined(HAVE_GETADDRINFO)
- struct addrinfo hint, *result = NULL;
-#elif defined(HAVE_GETHOSTBYNAME)
- struct hostent *hp;
#endif
/*
@@ -3221,9 +3138,7 @@ get_host_ipaddr(const char *host, guint32 *addrp)
}
#ifdef HAVE_C_ARES
- if (! (gbl_resolv_flags.concurrent_dns) ||
- name_resolve_concurrency < 1 ||
- ! async_dns_initialized) {
+ if (!async_dns_initialized || name_resolve_concurrency < 1) {
return FALSE;
}
ahe.addr_size = (int) sizeof (struct in_addr);
@@ -3246,37 +3161,6 @@ get_host_ipaddr(const char *host, guint32 *addrp)
return TRUE;
}
return FALSE;
-#elif defined(HAVE_GETADDRINFO)
- /*
- * This can be slow, particularly for capture files with lots of
- * addresses. Should we just return FALSE instead?
- */
- memset(&hint, 0, sizeof(hint));
- hint.ai_family = AF_INET;
- if (getaddrinfo(host, NULL, &hint, &result) == 0) {
- /* Probably more checks than necessary */
- if (result != NULL) {
- gboolean ret_val = FALSE;
- if (result->ai_family == AF_INET && result->ai_addrlen == 4) {
- memcpy(&ipaddr, result->ai_addr->sa_data, result->ai_addrlen);
- ret_val = TRUE;
- }
- freeaddrinfo(result);
- return ret_val;
- }
- }
-#elif defined(HAVE_GETHOSTBYNAME)
- hp = gethostbyname(host);
- if (hp == NULL) {
- /* No. */
- return FALSE;
- /* Apparently, some versions of gethostbyaddr can
- * return IPv6 addresses. */
- } else if (hp->h_length <= (int) sizeof (struct in_addr)) {
- memcpy(&ipaddr, hp->h_addr, hp->h_length);
- } else {
- return FALSE;
- }
#endif
} else {
/* Does the string really contain dotted-quad IP?
@@ -3306,10 +3190,6 @@ get_host_ipaddr6(const char *host, struct e_in6_addr *addrp)
int nfds;
fd_set rfds, wfds;
async_hostent_t ahe;
-#elif defined(HAVE_GETADDRINFO)
- struct addrinfo hint, *result = NULL;
-#elif defined(HAVE_GETHOSTBYNAME2)
- struct hostent *hp;
#endif /* HAVE_C_ARES */
if (str_to_ip6(host, addrp))
@@ -3329,9 +3209,7 @@ get_host_ipaddr6(const char *host, struct e_in6_addr *addrp)
/* try FQDN */
#ifdef HAVE_C_ARES
- if (! (gbl_resolv_flags.concurrent_dns) ||
- name_resolve_concurrency < 1 ||
- ! async_dns_initialized) {
+ if (!async_dns_initialized || name_resolve_concurrency < 1) {
return FALSE;
}
ahe.addr_size = (int) sizeof (struct e_in6_addr);
@@ -3353,31 +3231,6 @@ get_host_ipaddr6(const char *host, struct e_in6_addr *addrp)
if (ahe.addr_size == ahe.copied) {
return TRUE;
}
-#elif defined(HAVE_GETADDRINFO)
- /*
- * This can be slow, particularly for capture files with lots of
- * addresses. Should we just return FALSE instead?
- */
- memset(&hint, 0, sizeof(hint));
- hint.ai_family = AF_INET6;
- if (getaddrinfo(host, NULL, &hint, &result) == 0) {
- /* Probably more checks than necessary */
- if (result != NULL) {
- gboolean ret_val = FALSE;
- if (result->ai_family == AF_INET6 && result->ai_addrlen == sizeof(struct e_in6_addr)) {
- memcpy(addrp, result->ai_addr->sa_data, result->ai_addrlen);
- ret_val = TRUE;
- }
- freeaddrinfo(result);
- return ret_val;
- }
- }
-#elif defined(HAVE_GETHOSTBYNAME2)
- hp = gethostbyname2(host, AF_INET6);
- if (hp != NULL && hp->h_length == sizeof(struct e_in6_addr)) {
- memcpy(addrp, hp->h_addr, hp->h_length);
- return TRUE;
- }
#endif
return FALSE;
@@ -3389,13 +3242,14 @@ get_host_ipaddr6(const char *host, struct e_in6_addr *addrp)
* that we don't know)
*/
const char *
-host_ip_af(const char *host
-#if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETHOSTBYNAME2)
- _U_
+#ifdef HAVE_GETADDRINFO
+host_ip_af(const char *host)
+#else
+host_ip_af(const char *host _U_)
#endif
- )
{
const char *af = "ip";
+
#ifdef HAVE_GETADDRINFO
struct addrinfo hint, *result = NULL;
memset(&hint, 0, sizeof(hint));
@@ -3406,9 +3260,6 @@ host_ip_af(const char *host
}
freeaddrinfo(result);
}
-#elif defined(HAVE_GETHOSTBYNAME2)
- struct hostent *h;
- return (h = gethostbyname2(host, AF_INET6)) && h->h_addrtype == AF_INET6 ? "ip6" : "ip";
#endif
return af;
}