From 8c924288f5a6816dc0051953795fedb7b0dc8656 Mon Sep 17 00:00:00 2001 From: Nicholas Stommel Date: Wed, 21 Jun 2017 19:25:01 -0400 Subject: [PATCH] apply dns-leak fix downstream --- src/dns-manager/nm-dns-dnsmasq.c | 16 +++++--- src/dns-manager/nm-dns-manager.c | 64 +++++++++++++++---------------- src/dns-manager/nm-dns-manager.h | 2 + src/dns-manager/nm-dns-plugin.c | 2 +- src/dns-manager/nm-dns-plugin.h | 4 +- src/dns-manager/nm-dns-systemd-resolved.c | 32 +++++++++------- src/dns-manager/nm-dns-unbound.c | 2 +- 7 files changed, 66 insertions(+), 56 deletions(-) diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c index 0ad3e64..5915e67 100644 --- a/src/dns-manager/nm-dns-dnsmasq.c +++ b/src/dns-manager/nm-dns-dnsmasq.c @@ -576,13 +576,15 @@ start_dnsmasq (NMDnsDnsmasq *self) static gboolean update (NMDnsPlugin *plugin, - const NMDnsIPConfigData **configs, + const GPtrArray *configs, const NMGlobalDnsConfig *global_config, const char *hostname) { NMDnsDnsmasq *self = NM_DNS_DNSMASQ (plugin); NMDnsDnsmasqPrivate *priv = NM_DNS_DNSMASQ_GET_PRIVATE (self); GVariantBuilder servers; + guint i; + int prio, first_prio; start_dnsmasq (self); @@ -591,10 +593,14 @@ update (NMDnsPlugin *plugin, if (global_config) add_global_config (self, &servers, global_config); else { - while (*configs) { - add_ip_config_data (self, &servers, *configs); - configs++; - } + for (i = 0; i < configs->len; i++) { + prio = nm_dns_ip_config_data_get_dns_priority (configs->pdata[i]); + if (i == 0) + first_prio = prio; + else if (first_prio < 0 && first_prio != prio) + break; + add_ip_config_data (self, &servers, configs->pdata[i]); + } } g_clear_pointer (&priv->set_server_ex_args, g_variant_unref); diff --git a/src/dns-manager/nm-dns-manager.c b/src/dns-manager/nm-dns-manager.c index 6a0e879..6e71fb4 100644 --- a/src/dns-manager/nm-dns-manager.c +++ b/src/dns-manager/nm-dns-manager.c @@ -182,6 +182,19 @@ NM_UTILS_LOOKUP_STR_DEFINE_STATIC (_config_type_to_string, NMDnsIPConfigType, NM_UTILS_LOOKUP_STR_ITEM (NM_DNS_IP_CONFIG_TYPE_VPN, "vpn"), ); +int +nm_dns_ip_config_data_get_dns_priority (const NMDnsIPConfigData *config) +{ + g_return_val_if_fail (config, 0); + + if (NM_IS_IP4_CONFIG (config->config)) + return nm_ip4_config_get_dns_priority (config->config); + else if (NM_IS_IP6_CONFIG (config->config)) + return nm_ip6_config_get_dns_priority (config->config); + else + g_return_val_if_reached (0); +} + static NMDnsIPConfigData * ip_config_data_new (gpointer config, NMDnsIPConfigType type, const char *iface) { @@ -211,19 +224,10 @@ ip_config_data_destroy (gpointer ptr) static gint ip_config_data_compare (const NMDnsIPConfigData *a, const NMDnsIPConfigData *b) { - gboolean a_v4, b_v4; - gint a_prio, b_prio; - - a_v4 = NM_IS_IP4_CONFIG (a->config); - b_v4 = NM_IS_IP4_CONFIG (b->config); - - a_prio = a_v4 ? - nm_ip4_config_get_dns_priority ((NMIP4Config *) a->config) : - nm_ip6_config_get_dns_priority ((NMIP6Config *) a->config); + int a_prio, b_prio; - b_prio = b_v4 ? - nm_ip4_config_get_dns_priority ((NMIP4Config *) b->config) : - nm_ip6_config_get_dns_priority ((NMIP6Config *) b->config); + a_prio = nm_dns_ip_config_data_get_dns_priority (a); + b_prio = nm_dns_ip_config_data_get_dns_priority (b); /* Configurations with lower priority value first */ if (a_prio < b_prio) @@ -984,13 +988,12 @@ update_dns (NMDnsManager *self, char **options = NULL; char **nameservers = NULL; char **nis_servers = NULL; - int num, i, len; + guint i, j, num, len; gboolean caching = FALSE, update = TRUE; gboolean resolv_conf_updated = FALSE; SpawnResult result = SR_ERROR; NMConfigData *data; NMGlobalDnsConfig *global_config; - gs_free NMDnsIPConfigData **plugin_confs = NULL; nm_auto_free_gstring GString *tmp_gstring = NULL; g_return_val_if_fail (!error || !*error, FALSE); @@ -1027,27 +1030,24 @@ update_dns (NMDnsManager *self, if (global_config) merge_global_dns_config (&rc, global_config); else { - int prio, prev_prio = 0; + int prio, first_prio = 0; NMDnsIPConfigData *current; - gboolean skip = FALSE, v4; + gboolean v4; - plugin_confs = g_new (NMDnsIPConfigData *, priv->configs->len + 1); + for (i = 0, j = 0; i < priv->configs->len; i++) { + gboolean skip = FALSE; - for (i = 0; i < priv->configs->len; i++) { current = priv->configs->pdata[i]; - v4 = NM_IS_IP4_CONFIG (current->config); + + prio = nm_dns_ip_config_data_get_dns_priority (current); - prio = v4 ? - nm_ip4_config_get_dns_priority ((NMIP4Config *) current->config) : - nm_ip6_config_get_dns_priority ((NMIP6Config *) current->config); - - if (prev_prio < 0 && prio != prev_prio) { + if (i == 0) + first_prio = prio; + else if (first_prio < 0 && first_prio != prio) skip = TRUE; - plugin_confs[i] = NULL; - } - - prev_prio = prio; + v4 = NM_IS_IP4_CONFIG (current->config); + _LOGT ("config: %8d %-7s v%c %-16s %s: %s", prio, _config_type_to_string (current->type), @@ -1056,12 +1056,10 @@ update_dns (NMDnsManager *self, skip ? "" : "", get_nameserver_list (current->config, &tmp_gstring)); - if (!skip) { + if (!skip) merge_one_ip_config_data (self, &rc, current); - plugin_confs[i] = current; - } + } - plugin_confs[i] = NULL; } /* If the hostname is a FQDN ("dcbw.example.com"), then add the domain part of it @@ -1136,7 +1134,7 @@ update_dns (NMDnsManager *self, _LOGD ("update-dns: updating plugin %s", plugin_name); if (!nm_dns_plugin_update (plugin, - (const NMDnsIPConfigData **) plugin_confs, + priv->configs, global_config, priv->hostname)) { _LOGW ("update-dns: plugin %s update failed", plugin_name); diff --git a/src/dns-manager/nm-dns-manager.h b/src/dns-manager/nm-dns-manager.h index 3deda58..5439c0a 100644 --- a/src/dns-manager/nm-dns-manager.h +++ b/src/dns-manager/nm-dns-manager.h @@ -44,6 +44,8 @@ typedef struct { char *iface; } NMDnsIPConfigData; +int nm_dns_ip_config_data_get_dns_priority (const NMDnsIPConfigData *config); + #define NM_TYPE_DNS_MANAGER (nm_dns_manager_get_type ()) #define NM_DNS_MANAGER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), NM_TYPE_DNS_MANAGER, NMDnsManager)) #define NM_DNS_MANAGER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), NM_TYPE_DNS_MANAGER, NMDnsManagerClass)) diff --git a/src/dns-manager/nm-dns-plugin.c b/src/dns-manager/nm-dns-plugin.c index f065a1c..b26f4db 100644 --- a/src/dns-manager/nm-dns-plugin.c +++ b/src/dns-manager/nm-dns-plugin.c @@ -74,7 +74,7 @@ static guint signals[LAST_SIGNAL] = { 0 }; gboolean nm_dns_plugin_update (NMDnsPlugin *self, - const NMDnsIPConfigData **configs, + const GPtrArray *configs, const NMGlobalDnsConfig *global_config, const char *hostname) { diff --git a/src/dns-manager/nm-dns-plugin.h b/src/dns-manager/nm-dns-plugin.h index e24bc17..5d6747b 100644 --- a/src/dns-manager/nm-dns-plugin.h +++ b/src/dns-manager/nm-dns-plugin.h @@ -47,7 +47,7 @@ typedef struct { * configuration. */ gboolean (*update) (NMDnsPlugin *self, - const NMDnsIPConfigData **configs, + const GPtrArray *configs, const NMGlobalDnsConfig *global_config, const char *hostname); @@ -84,7 +84,7 @@ gboolean nm_dns_plugin_is_caching (NMDnsPlugin *self); const char *nm_dns_plugin_get_name (NMDnsPlugin *self); gboolean nm_dns_plugin_update (NMDnsPlugin *self, - const NMDnsIPConfigData **configs, + const GPtrArray *configs, const NMGlobalDnsConfig *global_config, const char *hostname); diff --git a/src/dns-manager/nm-dns-systemd-resolved.c b/src/dns-manager/nm-dns-systemd-resolved.c index 6bdd5f6..b69b59d 100644 --- a/src/dns-manager/nm-dns-systemd-resolved.c +++ b/src/dns-manager/nm-dns-systemd-resolved.c @@ -99,12 +99,12 @@ call_done (GObject *source, GAsyncResult *r, gpointer user_data) static void add_interface_configuration (NMDnsSystemdResolved *self, GArray *interfaces, - const NMDnsIPConfigData *data) + const NMDnsIPConfigData *data, + gboolean skip) { int i; InterfaceConfig *ic = NULL; int ifindex; - NMDevice *device; if (NM_IS_IP4_CONFIG (data->config)) ifindex = nm_ip4_config_get_ifindex (data->config); @@ -113,11 +113,6 @@ add_interface_configuration (NMDnsSystemdResolved *self, else g_return_if_reached (); - device = nm_manager_get_device_by_ifindex (nm_manager_get (), ifindex); - - if (!nm_device_get_managed (device, FALSE)) - return; - for (i = 0; i < interfaces->len; i++) { InterfaceConfig *tic = &g_array_index (interfaces, InterfaceConfig, i); if (ifindex == tic->ifindex) { @@ -133,7 +128,8 @@ add_interface_configuration (NMDnsSystemdResolved *self, ic->ifindex = ifindex; } - ic->configs = g_list_append (ic->configs, data->config); + if (!skip) + ic->configs = g_list_append (ic->configs, data->config); } static void @@ -291,17 +287,25 @@ send_updates (NMDnsSystemdResolved *self) static gboolean update (NMDnsPlugin *plugin, - const NMDnsIPConfigData **configs, + const GPtrArray *configs, const NMGlobalDnsConfig *global_config, const char *hostname) { NMDnsSystemdResolved *self = NM_DNS_SYSTEMD_RESOLVED (plugin); GArray *interfaces = g_array_new (TRUE, TRUE, sizeof (InterfaceConfig)); - const NMDnsIPConfigData **c; - int i; - - for (c = configs; *c != NULL; c++) - add_interface_configuration (self, interfaces, *c); + guint i; + int prio, first_prio = 0; + + for (i = 0; i < configs->len; i++) { + gboolean skip = FALSE; + + prio = nm_dns_ip_config_data_get_dns_priority (configs->pdata[i]); + if (i == 0) + first_prio = prio; + else if (first_prio < 0 && first_prio != prio) + skip = TRUE; + add_interface_configuration (self, interfaces, configs->pdata[i], skip); + } free_pending_updates (self); diff --git a/src/dns-manager/nm-dns-unbound.c b/src/dns-manager/nm-dns-unbound.c index 66a287f..44f5235 100644 --- a/src/dns-manager/nm-dns-unbound.c +++ b/src/dns-manager/nm-dns-unbound.c @@ -28,7 +28,7 @@ G_DEFINE_TYPE (NMDnsUnbound, nm_dns_unbound, NM_TYPE_DNS_PLUGIN) static gboolean update (NMDnsPlugin *plugin, - const NMDnsIPConfigData **configs, + const GPtrArray *configs, const NMGlobalDnsConfig *global_config, const char *hostname) { -- 2.11.0