diff --git a/configure.ac b/configure.ac index b525de633b..89f74e8ba8 100644 --- a/configure.ac +++ b/configure.ac @@ -622,6 +622,12 @@ AC_DEFINE_UNQUOTED(KERNEL_FIRMWARE_DIR, "$KERNEL_FIRMWARE_DIR", [Define to path AC_SUBST(KERNEL_FIRMWARE_DIR) PKG_CHECK_MODULES(LIBSOUP, [libsoup-2.4 >= 2.26], [have_libsoup=yes],[have_libsoup=no]) +if test "$have_libsoup" = "yes"; then + AC_DEFINE(HAVE_LIBSOUP, 1, [Define if you have libsoup]) +else + AC_DEFINE(HAVE_LIBSOUP, 0, [Define if you have libsoup]) +fi + AC_ARG_ENABLE(concheck, AS_HELP_STRING([--enable-concheck], [enable connectivity checking support]), [enable_concheck=${enableval}], [enable_concheck=${have_libsoup}]) if (test "${enable_concheck}" = "yes"); then diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index af5f95b589..e23b58760e 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -46,6 +46,16 @@ #include "nm-dns-plugin.h" #include "nm-dns-dnsmasq.h" +#ifdef HAVE_LIBSOUP +#include +#endif + +#if defined (SOUP_CHECK_VERSION) && SOUP_CHECK_VERSION (2, 40, 0) +#define DOMAIN_IS_VALID(domain) (*(domain) && !soup_tld_domain_is_public_suffix (domain)) +#else +#define DOMAIN_IS_VALID(domain) (*(domain)) +#endif + G_DEFINE_TYPE (NMDnsManager, nm_dns_manager, G_TYPE_OBJECT) #define NM_DNS_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), \ @@ -129,14 +139,22 @@ merge_one_ip4_config (NMResolvConfData *rc, NMIP4Config *src) const char *domain; domain = nm_ip4_config_get_domain (src, i); + if (!DOMAIN_IS_VALID (domain)) + continue; if (!rc->domain) rc->domain = domain; add_string_item (rc->searches, domain); } num = nm_ip4_config_get_num_searches (src); - for (i = 0; i < num; i++) - add_string_item (rc->searches, nm_ip4_config_get_search (src, i)); + for (i = 0; i < num; i++) { + const char *search; + + search = nm_ip4_config_get_search (src, i); + if (!DOMAIN_IS_VALID (search)) + continue; + add_string_item (rc->searches, search); + } /* NIS stuff */ num = nm_ip4_config_get_num_nis_servers (src); @@ -194,14 +212,22 @@ merge_one_ip6_config (NMResolvConfData *rc, NMIP6Config *src) const char *domain; domain = nm_ip6_config_get_domain (src, i); + if (!DOMAIN_IS_VALID (domain)) + continue; if (!rc->domain) rc->domain = domain; add_string_item (rc->searches, domain); } num = nm_ip6_config_get_num_searches (src); - for (i = 0; i < num; i++) - add_string_item (rc->searches, nm_ip6_config_get_search (src, i)); + for (i = 0; i < num; i++) { + const char *search; + + search = nm_ip6_config_get_search (src, i); + if (!DOMAIN_IS_VALID (search)) + continue; + add_string_item (rc->searches, search); + } } @@ -636,7 +662,7 @@ update_dns (NMDnsManager *self, const char *hostsearch = strchr (priv->hostname, '.'); /* +1 to get rid of the dot */ - if (hostsearch && strlen (hostsearch + 1)) + if (hostsearch && DOMAIN_IS_VALID (hostsearch + 1)) add_string_item (rc.searches, hostsearch + 1); } @@ -944,9 +970,18 @@ nm_dns_manager_remove_ip6_config (NMDnsManager *mgr, NMIP6Config *config) return TRUE; } +void +nm_dns_manager_set_initial_hostname (NMDnsManager *mgr, + const char *hostname) +{ + NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (mgr); + + priv->hostname = g_strdup (hostname); +} + void nm_dns_manager_set_hostname (NMDnsManager *mgr, - const char *hostname) + const char *hostname) { NMDnsManagerPrivate *priv = NM_DNS_MANAGER_GET_PRIVATE (mgr); GError *error = NULL; @@ -1044,8 +1079,7 @@ nm_dns_manager_get (void) if (!singleton) { singleton = NM_DNS_MANAGER (g_object_new (NM_TYPE_DNS_MANAGER, NULL)); g_assert (singleton); - } else - g_object_ref (singleton); + } return singleton; } diff --git a/src/dns-manager/nm-dns-manager.h b/src/dns-manager/nm-dns-manager.h index 8e9a05dcda..b2bf2467c2 100644 --- a/src/dns-manager/nm-dns-manager.h +++ b/src/dns-manager/nm-dns-manager.h @@ -87,8 +87,10 @@ gboolean nm_dns_manager_add_ip6_config (NMDnsManager *mgr, gboolean nm_dns_manager_remove_ip6_config (NMDnsManager *mgr, NMIP6Config *config); -void nm_dns_manager_set_hostname (NMDnsManager *mgr, - const char *hostname); +void nm_dns_manager_set_initial_hostname (NMDnsManager *mgr, + const char *hostname); +void nm_dns_manager_set_hostname (NMDnsManager *mgr, + const char *hostname); /** * NMDnsManagerResolvConfMode: diff --git a/src/nm-policy.c b/src/nm-policy.c index 37b82340eb..e6a04983ed 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -900,13 +900,11 @@ static void update_routing_and_dns (NMPolicy *policy, gboolean force_update) { NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); - NMDnsManager *mgr; - mgr = nm_dns_manager_get (); - nm_dns_manager_begin_updates (mgr, __func__); + nm_dns_manager_begin_updates (priv->dns_manager, __func__); - update_ip4_dns (policy, mgr); - update_ip6_dns (policy, mgr); + update_ip4_dns (policy, priv->dns_manager); + update_ip6_dns (policy, priv->dns_manager); update_ip4_routing (policy, force_update); update_ip6_routing (policy, force_update); @@ -914,8 +912,7 @@ update_routing_and_dns (NMPolicy *policy, gboolean force_update) /* Update the system hostname */ update_system_hostname (policy, priv->default_device4, priv->default_device6); - nm_dns_manager_end_updates (mgr, __func__); - g_object_unref (mgr); + nm_dns_manager_end_updates (priv->dns_manager, __func__); } static void @@ -1713,13 +1710,12 @@ device_removed (NMManager *manager, NMDevice *device, gpointer user_data) static void vpn_connection_activated (NMPolicy *policy, NMVPNConnection *vpn) { - NMDnsManager *mgr; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); NMIP4Config *ip4_config; NMIP6Config *ip6_config; const char *ip_iface; - mgr = nm_dns_manager_get (); - nm_dns_manager_begin_updates (mgr, __func__); + nm_dns_manager_begin_updates (priv->dns_manager, __func__); ip_iface = nm_vpn_connection_get_ip_iface (vpn); @@ -1727,42 +1723,41 @@ vpn_connection_activated (NMPolicy *policy, NMVPNConnection *vpn) ip4_config = nm_vpn_connection_get_ip4_config (vpn); if (ip4_config) - nm_dns_manager_add_ip4_config (mgr, ip_iface, ip4_config, NM_DNS_IP_CONFIG_TYPE_VPN); + nm_dns_manager_add_ip4_config (priv->dns_manager, ip_iface, ip4_config, NM_DNS_IP_CONFIG_TYPE_VPN); ip6_config = nm_vpn_connection_get_ip6_config (vpn); if (ip6_config) - nm_dns_manager_add_ip6_config (mgr, ip_iface, ip6_config, NM_DNS_IP_CONFIG_TYPE_VPN); + nm_dns_manager_add_ip6_config (priv->dns_manager, ip_iface, ip6_config, NM_DNS_IP_CONFIG_TYPE_VPN); update_routing_and_dns (policy, TRUE); - nm_dns_manager_end_updates (mgr, __func__); + nm_dns_manager_end_updates (priv->dns_manager, __func__); } static void vpn_connection_deactivated (NMPolicy *policy, NMVPNConnection *vpn) { - NMDnsManager *mgr; + NMPolicyPrivate *priv = NM_POLICY_GET_PRIVATE (policy); NMIP4Config *ip4_config; NMIP6Config *ip6_config; - mgr = nm_dns_manager_get (); - nm_dns_manager_begin_updates (mgr, __func__); + nm_dns_manager_begin_updates (priv->dns_manager, __func__); ip4_config = nm_vpn_connection_get_ip4_config (vpn); if (ip4_config) { /* Remove the VPN connection's IP4 config from DNS */ - nm_dns_manager_remove_ip4_config (mgr, ip4_config); + nm_dns_manager_remove_ip4_config (priv->dns_manager, ip4_config); } ip6_config = nm_vpn_connection_get_ip6_config (vpn); if (ip6_config) { /* Remove the VPN connection's IP6 config from DNS */ - nm_dns_manager_remove_ip6_config (mgr, ip6_config); + nm_dns_manager_remove_ip6_config (priv->dns_manager, ip6_config); } update_routing_and_dns (policy, TRUE); - nm_dns_manager_end_updates (mgr, __func__); + nm_dns_manager_end_updates (priv->dns_manager, __func__); } static void @@ -2097,8 +2092,9 @@ nm_policy_new (NMManager *manager, NMSettings *settings) priv->fw_started_id = id; priv->dns_manager = nm_dns_manager_get (); + nm_dns_manager_set_initial_hostname (priv->dns_manager, priv->orig_hostname); priv->config_changed_id = g_signal_connect (priv->dns_manager, "config-changed", - G_CALLBACK (dns_config_changed), policy); + G_CALLBACK (dns_config_changed), policy); priv->resolver = g_resolver_get_default (); @@ -2210,7 +2206,6 @@ dispose (GObject *object) if (priv->dns_manager) { g_signal_handler_disconnect (priv->dns_manager, priv->config_changed_id); - g_object_unref (priv->dns_manager); priv->dns_manager = NULL; }