diff options
author | Jeff Morriss <jeff.morriss.ws@gmail.com> | 2015-02-26 21:10:25 -0500 |
---|---|---|
committer | Jeff Morriss <jeff.morriss.ws@gmail.com> | 2015-02-27 21:09:23 +0000 |
commit | edb5e4b7ff76ebc7c246dcc9c96f346da4bfcc23 (patch) | |
tree | ba8ce29c4c25845d10138217802edb0ebc58b7c1 /epan/addr_resolv.c | |
parent | e5e8af9c71ce47cd2342135ad941b144bfb864ec (diff) | |
download | wireshark-edb5e4b7ff76ebc7c246dcc9c96f346da4bfcc23.tar.gz wireshark-edb5e4b7ff76ebc7c246dcc9c96f346da4bfcc23.tar.bz2 wireshark-edb5e4b7ff76ebc7c246dcc9c96f346da4bfcc23.zip |
Use getnameinfo() instead of gethostbyaddr().
Also fix up some formatting.
Change-Id: I3348179626e97daaddfbc89e3ed21e39915e3de4
Reviewed-on: https://code.wireshark.org/review/7423
Petri-Dish: Jeff Morriss <jeff.morriss.ws@gmail.com>
Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org>
Reviewed-by: Jeff Morriss <jeff.morriss.ws@gmail.com>
Diffstat (limited to 'epan/addr_resolv.c')
-rw-r--r-- | epan/addr_resolv.c | 179 |
1 files changed, 90 insertions, 89 deletions
diff --git a/epan/addr_resolv.c b/epan/addr_resolv.c index 6776001e31..a89b76861f 100644 --- a/epan/addr_resolv.c +++ b/epan/addr_resolv.c @@ -289,7 +289,7 @@ static gboolean ipv6_equal(gconstpointer v1, gconstpointer v2) { - if( memcmp(v1, v2, sizeof (struct e_in6_addr)) == 0 ) { + if (memcmp(v1, v2, sizeof (struct e_in6_addr)) == 0) { return TRUE; } @@ -476,7 +476,7 @@ add_service_name(port_type proto, const guint port, const char *service_name) g_free(key); } - switch(proto){ + switch(proto) { case PT_TCP: g_free(serv_port_table->tcp_name); serv_port_table->tcp_name = g_strdup(service_name); @@ -538,26 +538,26 @@ parse_service_line (char *line) return; /* seems we got all interesting things from the file */ - if(strcmp(cp, "tcp") == 0) { + if (strcmp(cp, "tcp") == 0) { max_port = MAX_TCP_PORT; proto = PT_TCP; } - else if(strcmp(cp, "udp") == 0) { + else if (strcmp(cp, "udp") == 0) { max_port = MAX_UDP_PORT; proto = PT_UDP; } - else if(strcmp(cp, "sctp") == 0) { + else if (strcmp(cp, "sctp") == 0) { max_port = MAX_SCTP_PORT; proto = PT_SCTP; } - else if(strcmp(cp, "dccp") == 0) { + else if (strcmp(cp, "dccp") == 0) { max_port = MAX_DCCP_PORT; proto = PT_DCCP; } else { return; } - if(CVT_NO_ERROR != range_convert_str(&port_rng, port, max_port) ) { + if (CVT_NO_ERROR != range_convert_str(&port_rng, port, max_port)) { /* some assertion here? */ return; } @@ -621,26 +621,26 @@ static gchar serv_port_table = (serv_port_t *)g_hash_table_lookup(serv_port_hashtable, &port); - if(serv_port_table){ + if (serv_port_table) { /* Set which table we should look up port in */ switch(proto) { case PT_UDP: - if(serv_port_table->udp_name){ + if (serv_port_table->udp_name) { return serv_port_table->udp_name; } break; case PT_TCP: - if(serv_port_table->tcp_name){ + if (serv_port_table->tcp_name) { return serv_port_table->tcp_name; } break; case PT_SCTP: - if(serv_port_table->sctp_name){ + if (serv_port_table->sctp_name) { return serv_port_table->sctp_name; } break; case PT_DCCP: - if(serv_port_table->dccp_name){ + if (serv_port_table->dccp_name) { return serv_port_table->dccp_name; } break; @@ -658,7 +658,7 @@ static gchar name = (gchar*)g_malloc(16); guint32_to_str_buf(port, name, 16); - if(serv_port_table == NULL){ + if (serv_port_table == NULL) { int *key; key = (int *)g_new(int, 1); @@ -748,7 +748,7 @@ initialize_services(void) static void service_name_lookup_cleanup(void) { - if(serv_port_hashtable){ + if (serv_port_hashtable) { g_hash_table_destroy(serv_port_hashtable); serv_port_hashtable = NULL; } @@ -769,7 +769,7 @@ fill_dummy_ip4(const guint addr, hashipv4_t* volatile tp) /* Do we have a subnet for this address? */ subnet_entry = subnet_lookup(addr); - if(0 != subnet_entry.mask) { + if (0 != subnet_entry.mask) { /* Print name, then '.' then IP address after subnet mask */ guint32 host_addr; gchar buffer[MAX_IP_STR_LEN]; @@ -787,7 +787,7 @@ fill_dummy_ip4(const guint addr, hashipv4_t* volatile tp) */ i = subnet_entry.mask_length / 8; while(*(paddr) != '\0' && i > 0) { - if(*(++paddr) == '.') { + if (*(++paddr) == '.') { --i; } } @@ -857,19 +857,18 @@ static hashipv4_t * host_lookup(const guint addr, gboolean *found) { hashipv4_t * volatile tp; - struct hostent *hostp; *found = TRUE; tp = (hashipv4_t *)g_hash_table_lookup(ipv4_hash_table, GUINT_TO_POINTER(addr)); - if(tp == NULL){ + if (tp == NULL) { 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){ + } else { + if ((tp->flags & DUMMY_AND_RESOLVE_FLGS) == DUMMY_ADDRESS_ENTRY) { goto try_resolv; } - if ((tp->flags & DUMMY_ADDRESS_ENTRY) == DUMMY_ADDRESS_ENTRY){ + if ((tp->flags & DUMMY_ADDRESS_ENTRY) == DUMMY_ADDRESS_ENTRY) { *found = FALSE; } return tp; @@ -890,33 +889,34 @@ try_resolv: fill_dummy_ip4(addr, tp); return tp; } -#endif /* ASYNC_DNS */ - +#elif defined(HAVE_GETADDRINFO) /* * 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. */ if (addr != 0) { - /* Use async DNS if possible, else fall back to timeouts, - * else call gethostbyaddr and hope for the best - */ - - hostp = gethostbyaddr((const char *)&addr, 4, AF_INET); - - if (hostp != NULL && hostp->h_name[0] != '\0') { - g_strlcpy(tp->name, hostp->h_name, MAXNAMELEN); + 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; } } +#endif /* unknown host or DNS timeout */ - } *found = FALSE; - fill_dummy_ip4(addr, tp); return tp; @@ -941,25 +941,26 @@ host_lookup6(const struct e_in6_addr *addr, gboolean *found) #ifdef INET6 #ifdef HAVE_C_ARES async_dns_queue_msg_t *caqm; -#endif /* HAVE_C_ARES */ - struct hostent *hostp; +#elif defined(HAVE_GETADDRINFO) + struct sockaddr_in6 sin6; +#endif #endif /* INET6 */ *found = TRUE; tp = (hashipv6_t *)g_hash_table_lookup(ipv6_hash_table, addr); - if(tp == NULL){ + if (tp == NULL) { struct e_in6_addr *addr_key; addr_key = g_new(struct e_in6_addr,1); 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){ + } else { + if ((tp->flags & DUMMY_AND_RESOLVE_FLGS) == DUMMY_ADDRESS_ENTRY) { goto try_resolv; } - if ((tp->flags & DUMMY_ADDRESS_ENTRY) == DUMMY_ADDRESS_ENTRY){ + if ((tp->flags & DUMMY_ADDRESS_ENTRY) == DUMMY_ADDRESS_ENTRY) { *found = FALSE; } return tp; @@ -970,7 +971,6 @@ try_resolv: gbl_resolv_flags.use_external_net_name_resolver) { tp->flags = tp->flags|TRIED_RESOLVE_ADDRESS; #ifdef INET6 - #ifdef HAVE_C_ARES if ((gbl_resolv_flags.concurrent_dns) && name_resolve_concurrency > 0 && @@ -983,22 +983,23 @@ try_resolv: /* XXX found is set to TRUE, which seems a bit odd, but I'm not * going to risk changing the semantics. */ - if ((tp->flags & DUMMY_ADDRESS_ENTRY) == 0){ + if ((tp->flags & DUMMY_ADDRESS_ENTRY) == 0) { g_strlcpy(tp->name, tp->ip6, MAXNAMELEN); ip6_to_str_buf(addr, tp->name); tp->flags = tp->flags | DUMMY_ADDRESS_ENTRY; } return tp; } -#endif /* HAVE_C_ARES */ - - /* 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; - } +#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; + } +#endif #endif /* INET6 */ } @@ -1383,7 +1384,7 @@ manuf_name_lookup(const guint8 *addr) * by the IEEE but the local administrator instead. * 0x01 multicast / broadcast bit * 0x02 locally administered bit */ - if((manuf_key & 0x00010000) != 0){ + if ((manuf_key & 0x00010000) != 0) { manuf_key &= 0x00FEFFFF; manuf_value = (hashmanuf_t*)g_hash_table_lookup(manuf_hashtable, &manuf_key); if (manuf_value != NULL) { @@ -1404,7 +1405,7 @@ wka_name_lookup(const guint8 *addr, const unsigned int mask) gint i; gchar *name; - if(wka_hashtable == NULL){ + if (wka_hashtable == NULL) { return NULL; } /* Get the part of the address covered by the mask. */ @@ -1496,16 +1497,16 @@ static void eth_name_lookup_cleanup(void) { - if(manuf_hashtable) { + if (manuf_hashtable) { g_hash_table_destroy(manuf_hashtable); manuf_hashtable = NULL; } - if(wka_hashtable) { + if (wka_hashtable) { g_hash_table_destroy(wka_hashtable); wka_hashtable = NULL; } - if(eth_hashtable) { + if (eth_hashtable) { g_hash_table_destroy(eth_hashtable); eth_hashtable = NULL; } @@ -1662,7 +1663,7 @@ add_eth_name(const guint8 *addr, const gchar *name) tp = (hashether_t *)g_hash_table_lookup(eth_hashtable, addr); - if( tp == NULL ){ + if (tp == NULL) { tp = eth_hash_new_entry(addr, FALSE); } @@ -1679,10 +1680,10 @@ eth_name_lookup(const guint8 *addr, const gboolean resolve) hashether_t *tp; tp = (hashether_t *)g_hash_table_lookup(eth_hashtable, addr); - if( tp == NULL ) { + if (tp == NULL) { tp = eth_hash_new_entry(addr, resolve); } else { - if (resolve && (tp->status == HASHETHER_STATUS_UNRESOLVED)){ + if (resolve && (tp->status == HASHETHER_STATUS_UNRESOLVED)) { eth_addr_resolve(tp); /* Found but needs to be resolved */ } } @@ -1898,7 +1899,7 @@ initialize_ipxnets(void) static void ipx_name_lookup_cleanup(void) { - if(ipxnet_hash_table){ + if (ipxnet_hash_table) { g_hash_table_destroy(ipxnet_hash_table); ipxnet_hash_table = NULL; } @@ -1912,9 +1913,9 @@ add_ipxnet_name(guint addr, const gchar *name) hashipxnet_t *tp; tp = (hashipxnet_t *)g_hash_table_lookup(ipxnet_hash_table, &addr); - if(tp){ + if (tp) { g_strlcpy(tp->name, name, MAXNAMELEN); - }else{ + } else { int *key; key = (int *)g_new(int, 1); @@ -1941,14 +1942,14 @@ ipxnet_name_lookup(wmem_allocator_t *allocator, const guint addr) ipxnet_t *ipxnet; tp = (hashipxnet_t *)g_hash_table_lookup(ipxnet_hash_table, &addr); - if(tp == NULL){ + if (tp == NULL) { int *key; key = (int *)g_new(int, 1); *key = addr; tp = g_new(hashipxnet_t, 1); g_hash_table_insert(ipxnet_hash_table, key, tp); - }else{ + } else { return wmem_strdup(allocator, tp->name); } @@ -2150,7 +2151,7 @@ ipv4_hash_table_resolved_to_list(gpointer key _U_, gpointer value, gpointer user addrinfo_lists_t *lists = (addrinfo_lists_t*)user_data; hashipv4_t *ipv4_hash_table_entry = (hashipv4_t *)value; - if((ipv4_hash_table_entry->flags & USED_AND_RESOLVED_MASK) == RESOLVED_ADDRESS_USED){ + if ((ipv4_hash_table_entry->flags & USED_AND_RESOLVED_MASK) == RESOLVED_ADDRESS_USED) { lists->ipv4_addr_list = g_list_prepend (lists->ipv4_addr_list, ipv4_hash_table_entry); } @@ -2166,7 +2167,7 @@ ipv6_hash_table_resolved_to_list(gpointer key _U_, gpointer value, gpointer user addrinfo_lists_t *lists = (addrinfo_lists_t*)user_data; hashipv6_t *ipv6_hash_table_entry = (hashipv6_t *)value; - if((ipv6_hash_table_entry->flags & USED_AND_RESOLVED_MASK) == RESOLVED_ADDRESS_USED){ + if ((ipv6_hash_table_entry->flags & USED_AND_RESOLVED_MASK) == RESOLVED_ADDRESS_USED) { lists->ipv6_addr_list = g_list_prepend (lists->ipv6_addr_list, ipv6_hash_table_entry); } @@ -2175,11 +2176,11 @@ ipv6_hash_table_resolved_to_list(gpointer key _U_, gpointer value, gpointer user addrinfo_lists_t * get_addrinfo_list(void) { - if(ipv4_hash_table){ + if (ipv4_hash_table) { g_hash_table_foreach(ipv4_hash_table, ipv4_hash_table_resolved_to_list, &addrinfo_lists); } - if(ipv6_hash_table){ + if (ipv6_hash_table) { g_hash_table_foreach(ipv6_hash_table, ipv6_hash_table_resolved_to_list, &addrinfo_lists); } @@ -2223,7 +2224,7 @@ read_subnets_file (const char *subnetspath) /* Expected format is <IP4 address>/<subnet length> */ cp2 = strchr(cp, '/'); - if(NULL == cp2) { + if (NULL == cp2) { /* No length */ continue; } @@ -2236,7 +2237,7 @@ read_subnets_file (const char *subnetspath) } mask_length = atoi(cp2); - if(0 >= mask_length || mask_length > 31) { + if (0 >= mask_length || mask_length > 31) { continue; /* invalid mask length */ } @@ -2271,7 +2272,7 @@ subnet_lookup(const guint32 addr) length_entry = &subnet_length_entries[i]; - if(NULL != length_entry->subnet_addresses) { + if (NULL != length_entry->subnet_addresses) { sub_net_hashipv4_t * tp; guint32 hash_idx; @@ -2283,7 +2284,7 @@ subnet_lookup(const guint32 addr) tp = tp->next; } - if(NULL != tp) { + if (NULL != tp) { subnet_entry.mask = length_entry->mask; subnet_entry.mask_length = i + 1; /* Length is offset + 1 */ subnet_entry.name = tp->name; @@ -2318,12 +2319,12 @@ subnet_entry_set(guint32 subnet_addr, const guint32 mask_length, const gchar* na hash_idx = HASH_IPV4_ADDRESS(subnet_addr); - if(NULL == entry->subnet_addresses) { + if (NULL == entry->subnet_addresses) { entry->subnet_addresses = (sub_net_hashipv4_t**) g_malloc0(sizeof(sub_net_hashipv4_t*) * HASHHOSTSIZE); } - if(NULL != (tp = entry->subnet_addresses[hash_idx])) { - if(tp->addr == subnet_addr) { + if (NULL != (tp = entry->subnet_addresses[hash_idx])) { + if (tp->addr == subnet_addr) { return; /* XXX provide warning that an address was repeated? */ } else { sub_net_hashipv4_t * new_tp = g_new(sub_net_hashipv4_t, 1); @@ -2661,9 +2662,9 @@ add_ipv4_name(const guint addr, const gchar *name) tp = (hashipv4_t *)g_hash_table_lookup(ipv4_hash_table, GUINT_TO_POINTER(addr)); - if(tp){ + if (tp) { g_strlcpy(tp->name, name, MAXNAMELEN); - }else{ + } else { tp = new_ipv4(addr); g_strlcpy(tp->name, name, MAXNAMELEN); g_hash_table_insert(ipv4_hash_table, GUINT_TO_POINTER(addr), tp); @@ -2689,9 +2690,9 @@ add_ipv6_name(const struct e_in6_addr *addrp, const gchar *name) return; tp = (hashipv6_t *)g_hash_table_lookup(ipv6_hash_table, addrp); - if(tp){ + if (tp) { g_strlcpy(tp->name, name, MAXNAMELEN); - }else{ + } else { struct e_in6_addr *addr_key; addr_key = g_new(struct e_in6_addr,1); @@ -2726,11 +2727,11 @@ add_manually_resolved_ipv6(gpointer data, gpointer user_data _U_) static void add_manually_resolved(void) { - if(manually_resolved_ipv4_list){ + if (manually_resolved_ipv4_list) { g_slist_foreach(manually_resolved_ipv4_list, add_manually_resolved_ipv4, NULL); } - if(manually_resolved_ipv6_list){ + if (manually_resolved_ipv6_list) { g_slist_foreach(manually_resolved_ipv6_list, add_manually_resolved_ipv6, NULL); } } @@ -2761,7 +2762,7 @@ host_name_lookup_init(void) /* * Load the global hosts file, if we have one. */ - if(!gbl_resolv_flags.load_hosts_file_from_profile_only){ + if (!gbl_resolv_flags.load_hosts_file_from_profile_only) { hostspath = get_datafile_path(ENAME_HOSTS); if (!read_hosts_file(hostspath, TRUE) && errno != ENOENT) { report_open_failure(hostspath, errno, FALSE); @@ -2807,7 +2808,7 @@ host_name_lookup_init(void) * XXX - should we base it on the dwPlatformId value from * GetVersionEx()? */ - if(!gbl_resolv_flags.load_hosts_file_from_profile_only){ + if (!gbl_resolv_flags.load_hosts_file_from_profile_only) { hostspath = g_strconcat(sysroot, rootpath_nt, NULL); if (!read_hosts_file(hostspath, TRUE)) { g_free(hostspath); @@ -2818,7 +2819,7 @@ host_name_lookup_init(void) } } #else /* _WIN32 */ - if(!gbl_resolv_flags.load_hosts_file_from_profile_only){ + if (!gbl_resolv_flags.load_hosts_file_from_profile_only) { read_hosts_file("/etc/hosts", TRUE); } #endif /* _WIN32 */ @@ -2843,7 +2844,7 @@ host_name_lookup_init(void) #endif /* HAVE_GNU_ADNS */ #endif /* HAVE_C_ARES */ - if(extra_hosts_files && !gbl_resolv_flags.load_hosts_file_from_profile_only){ + if (extra_hosts_files && !gbl_resolv_flags.load_hosts_file_from_profile_only) { for (i = 0; i < extra_hosts_files->len; i++) { read_hosts_file((const char *) g_ptr_array_index(extra_hosts_files, i), TRUE); } @@ -2860,17 +2861,17 @@ host_name_lookup_cleanup(void) guint32 i, j; _host_name_lookup_cleanup(); - if(ipxnet_hash_table){ + if (ipxnet_hash_table) { g_hash_table_destroy(ipxnet_hash_table); ipxnet_hash_table = NULL; } - if(ipv4_hash_table){ + if (ipv4_hash_table) { g_hash_table_destroy(ipv4_hash_table); ipv4_hash_table = NULL; } - if(ipv6_hash_table){ + if (ipv6_hash_table) { g_hash_table_destroy(ipv6_hash_table); ipv6_hash_table = NULL; } @@ -2911,13 +2912,13 @@ free_manually_resolved_ipv6(gpointer data, gpointer user_data _U_) void manually_resolve_cleanup(void) { - if(manually_resolved_ipv4_list){ + if (manually_resolved_ipv4_list) { g_slist_foreach(manually_resolved_ipv4_list, free_manually_resolved_ipv4, NULL); g_slist_free(manually_resolved_ipv4_list); manually_resolved_ipv4_list = NULL; } - if(manually_resolved_ipv6_list){ + if (manually_resolved_ipv6_list) { g_slist_foreach(manually_resolved_ipv6_list, free_manually_resolved_ipv6, NULL); g_slist_free(manually_resolved_ipv6_list); manually_resolved_ipv6_list = NULL; |