From ea7eb5ab5ef008b416edd620ee10c9a26c39ae4f Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Thu, 19 Dec 2013 11:05:43 -0500 Subject: [PATCH 1/3] dns-manager: make non-refcounted. All the cool singletons are doing it. Also, get rid of excess nm_dns_manager_get() calls in nm-policy.c; it already has priv->dns_manager. --- src/dns-manager/nm-dns-manager.c | 3 +-- src/nm-policy.c | 36 +++++++++++++------------------- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index af5f95b589..4fab663103 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -1044,8 +1044,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/nm-policy.c b/src/nm-policy.c index 37b82340eb..7dec5f774e 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 @@ -2098,7 +2093,7 @@ nm_policy_new (NMManager *manager, NMSettings *settings) priv->dns_manager = nm_dns_manager_get (); 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 +2205,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; } From 7d126290c4c82a9ae8ae59c1989ffd87b3f68730 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Tue, 17 Dec 2013 09:24:00 -0500 Subject: [PATCH 2/3] dns-manager: initialize hostname NMPolicy only updates the NMDnsManager's hostname when it changes, which previously did not include at startup. Meaning if your hostname never changed, NMDnsManager would never learn it (and so would never add an appropriate "search" line to resolv.conf). Fix that. --- src/dns-manager/nm-dns-manager.c | 11 ++++++++++- src/dns-manager/nm-dns-manager.h | 6 ++++-- src/nm-policy.c | 1 + 3 files changed, 15 insertions(+), 3 deletions(-) diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index 4fab663103..fa166fa350 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -944,9 +944,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; 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 7dec5f774e..e6a04983ed 100644 --- a/src/nm-policy.c +++ b/src/nm-policy.c @@ -2092,6 +2092,7 @@ 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); From dfe194eea60eb6d509ce4774857d461f3e579611 Mon Sep 17 00:00:00 2001 From: Dan Winship Date: Mon, 16 Dec 2013 13:51:24 -0500 Subject: [PATCH 3/3] dns-manager: don't add "public suffix" domains to search (rh #851521) If the hostname is "foo.example.com" then we want to add "search example.com" to resolv.conf, but if it's just "example.com", we don't want to add "search com" (rh #812394). So if NetworkManager is being built with recent libsoup, use soup_tld_domain_is_public_suffix() to double-check the domain before adding it. (If it is not being built with libsoup, or is being built with too old a version, we just skip that test, keeping the old behavior.) --- configure.ac | 6 ++++++ src/dns-manager/nm-dns-manager.c | 36 +++++++++++++++++++++++++++----- 2 files changed, 37 insertions(+), 5 deletions(-) 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 fa166fa350..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); }