From 3ce491100f84a1dc3dc92215f16f5cb5c48bff71 Mon Sep 17 00:00:00 2001 From: Thomas Haller Date: Thu, 2 Jun 2016 19:29:56 +0200 Subject: [PATCH] clear cache of dnsmasq when updating DNS configuration (rh#1338731) --- ...sq-clear-cache-and-restart-rh1338731.patch | 531 ++++++++++++++++++ NetworkManager.spec | 15 +- 2 files changed, 544 insertions(+), 2 deletions(-) create mode 100644 0001-dnsmasq-clear-cache-and-restart-rh1338731.patch diff --git a/0001-dnsmasq-clear-cache-and-restart-rh1338731.patch b/0001-dnsmasq-clear-cache-and-restart-rh1338731.patch new file mode 100644 index 0000000..bc5162c --- /dev/null +++ b/0001-dnsmasq-clear-cache-and-restart-rh1338731.patch @@ -0,0 +1,531 @@ +From 594a225264fe501ec78a8d20ee5447d18e1175b5 Mon Sep 17 00:00:00 2001 +From: Beniamino Galvani +Date: Tue, 31 May 2016 17:04:03 +0200 +Subject: [PATCH 1/6] core: fix some memory leaks + +(cherry picked from commit ec53ed2cbaab754ddf1283658b5adfba8134e757) +(cherry picked from commit 70d194c159c80266140157db535700f8e44dbe0b) +--- + src/dhcp-manager/nm-dhcp-client.c | 2 ++ + src/nm-manager.c | 2 +- + src/nm-policy.c | 1 + + 3 files changed, 4 insertions(+), 1 deletion(-) + +diff --git a/src/dhcp-manager/nm-dhcp-client.c b/src/dhcp-manager/nm-dhcp-client.c +index 9f4cdf3..c102581 100644 +--- a/src/dhcp-manager/nm-dhcp-client.c ++++ b/src/dhcp-manager/nm-dhcp-client.c +@@ -884,7 +884,9 @@ dispose (GObject *object) + + g_clear_pointer (&priv->iface, g_free); + g_clear_pointer (&priv->hostname, g_free); ++ g_clear_pointer (&priv->fqdn, g_free); + g_clear_pointer (&priv->uuid, g_free); ++ g_clear_pointer (&priv->client_id, g_bytes_unref); + + if (priv->hwaddr) { + g_byte_array_free (priv->hwaddr, TRUE); +diff --git a/src/nm-manager.c b/src/nm-manager.c +index e64c68a..04b70cb 100644 +--- a/src/nm-manager.c ++++ b/src/nm-manager.c +@@ -3268,7 +3268,7 @@ validate_activation_request (NMManager *self, + NM_MANAGER_ERROR, + NM_MANAGER_ERROR_CONNECTION_NOT_AVAILABLE, + "Sharing IPv6 connections is not supported yet."); +- return NULL; ++ goto error; + } + + /* Check whether it's a VPN or not */ +diff --git a/src/nm-policy.c b/src/nm-policy.c +index 07bcce8..cb04f21 100644 +--- a/src/nm-policy.c ++++ b/src/nm-policy.c +@@ -913,6 +913,7 @@ block_autoconnect_for_device (NMPolicy *self, NMDevice *device) + NM_DEVICE_STATE_REASON_USER_REQUESTED); + } + } ++ g_slist_free (connections); + } + + static void +-- +2.5.5 + + +From f5a98215c616a8a7f4acb9a3e03667444b8fda6e Mon Sep 17 00:00:00 2001 +From: Beniamino Galvani +Date: Tue, 24 May 2016 13:41:44 +0200 +Subject: [PATCH 2/6] dns/dnsmasq: cancel pending update on dispose + +There might be a pending "SetServersEx" D-Bus call when the plugin is +destroyed, ensure it gets canceled. + +(cherry picked from commit d376787ce1a9e8c4990ed98be143ab892c9d29ed) +(cherry picked from commit 7541ca0692668070e48adfc5fa8e4c6501600e16) +--- + src/dns-manager/nm-dns-dnsmasq.c | 21 ++++++++++++++++----- + 1 file changed, 16 insertions(+), 5 deletions(-) + +diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c +index 4cee160..1df01e3 100644 +--- a/src/dns-manager/nm-dns-dnsmasq.c ++++ b/src/dns-manager/nm-dns-dnsmasq.c +@@ -48,6 +48,7 @@ G_DEFINE_TYPE (NMDnsDnsmasq, nm_dns_dnsmasq, NM_TYPE_DNS_PLUGIN) + typedef struct { + GDBusProxy *dnsmasq; + GCancellable *dnsmasq_cancellable; ++ GCancellable *update_cancellable; + gboolean running; + + GVariant *set_server_ex_args; +@@ -265,14 +266,20 @@ add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6, + } + + static void +-dnsmasq_update_done (GObject *source, GAsyncResult *res, gpointer user_data) ++dnsmasq_update_done (GDBusProxy *proxy, GAsyncResult *res, gpointer user_data) + { +- NMDnsDnsmasq *self = NM_DNS_DNSMASQ (user_data); +- NMDnsDnsmasqPrivate *priv = NM_DNS_DNSMASQ_GET_PRIVATE (self); ++ NMDnsDnsmasq *self; ++ NMDnsDnsmasqPrivate *priv; + gs_free_error GError *error = NULL; + gs_unref_variant GVariant *response = NULL; + +- response = g_dbus_proxy_call_finish (priv->dnsmasq, res, &error); ++ response = g_dbus_proxy_call_finish (proxy, res, &error); ++ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ return; ++ ++ self = NM_DNS_DNSMASQ (user_data); ++ priv = NM_DNS_DNSMASQ_GET_PRIVATE (self); ++ + if (!response) + _LOGW ("dnsmasq update failed: %s", error->message); + else +@@ -290,12 +297,15 @@ send_dnsmasq_update (NMDnsDnsmasq *self) + if (priv->running) { + _LOGD ("trying to update dnsmasq nameservers"); + ++ nm_clear_g_cancellable (&priv->update_cancellable); ++ priv->update_cancellable = g_cancellable_new (); ++ + g_dbus_proxy_call (priv->dnsmasq, + "SetServersEx", + priv->set_server_ex_args, + G_DBUS_CALL_FLAGS_NONE, + -1, +- NULL, ++ priv->update_cancellable, + (GAsyncReadyCallback) dnsmasq_update_done, + self); + g_clear_pointer (&priv->set_server_ex_args, g_variant_unref); +@@ -559,6 +569,7 @@ dispose (GObject *object) + NMDnsDnsmasqPrivate *priv = NM_DNS_DNSMASQ_GET_PRIVATE (object); + + nm_clear_g_cancellable (&priv->dnsmasq_cancellable); ++ nm_clear_g_cancellable (&priv->update_cancellable); + + g_clear_object (&priv->dnsmasq); + +-- +2.5.5 + + +From ac4bfce7dde54a607c896e90a3269633a90f3bee Mon Sep 17 00:00:00 2001 +From: Beniamino Galvani +Date: Tue, 24 May 2016 14:14:25 +0200 +Subject: [PATCH 3/6] dns: clear dnsmasq cache after an update + +When the list of DNS servers changes, old DNS entries cached by +dnsmasq must be invalidated as the answers returned by new servers may +be different (especially, old NXDOMAIN entries may now be valid). Call +the dnsmasq "ClearCache" D-Bus method to achieve this. + +https://bugzilla.redhat.com/show_bug.cgi?id=1338731 +(cherry picked from commit 4feb58b50b9fd6caceda83bab907ad107ad8ed01) +(cherry picked from commit a701e5b7ba35a0730d756ab0c1b15f0414bee592) +--- + src/dns-manager/nm-dns-dnsmasq.c | 31 +++++++++++++++++++++++++++++-- + 1 file changed, 29 insertions(+), 2 deletions(-) + +diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c +index 1df01e3..dd1234d 100644 +--- a/src/dns-manager/nm-dns-dnsmasq.c ++++ b/src/dns-manager/nm-dns-dnsmasq.c +@@ -266,6 +266,25 @@ add_ip6_config (NMDnsDnsmasq *self, GVariantBuilder *servers, NMIP6Config *ip6, + } + + static void ++dnsmasq_clear_cache_done (GDBusProxy *proxy, GAsyncResult *res, gpointer user_data) ++{ ++ NMDnsDnsmasq *self; ++ gs_free_error GError *error = NULL; ++ gs_unref_variant GVariant *response = NULL; ++ ++ response = g_dbus_proxy_call_finish (proxy, res, &error); ++ if (g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) ++ return; ++ ++ self = NM_DNS_DNSMASQ (user_data); ++ ++ if (!response) ++ _LOGW ("dnsmasq cache clear failed: %s", error->message); ++ else ++ _LOGD ("dnsmasq update successful, cache cleared"); ++} ++ ++static void + dnsmasq_update_done (GDBusProxy *proxy, GAsyncResult *res, gpointer user_data) + { + NMDnsDnsmasq *self; +@@ -282,8 +301,16 @@ dnsmasq_update_done (GDBusProxy *proxy, GAsyncResult *res, gpointer user_data) + + if (!response) + _LOGW ("dnsmasq update failed: %s", error->message); +- else +- _LOGD ("dnsmasq update successful"); ++ else { ++ g_dbus_proxy_call (priv->dnsmasq, ++ "ClearCache", ++ NULL, ++ G_DBUS_CALL_FLAGS_NONE, ++ -1, ++ priv->update_cancellable, ++ (GAsyncReadyCallback) dnsmasq_clear_cache_done, ++ self); ++ } + } + + static void +-- +2.5.5 + + +From b71ce01f5aa5af2851a4c5516a1c11b86b65b4b8 Mon Sep 17 00:00:00 2001 +From: Beniamino Galvani +Date: Sun, 1 May 2016 22:24:41 +0200 +Subject: [PATCH 4/6] core: introduce nm_utils_dnsmasq_status_to_string() + +(cherry picked from commit c0d322720a3956a40831c09f78a1dfbaf6fd9294) +(cherry picked from commit 84b0bb5ec82661a2b47928cc49879ed49fa18602) +--- + src/dns-manager/nm-dns-dnsmasq.c | 23 ++------------------ + src/dnsmasq-manager/nm-dnsmasq-manager.c | 36 ++++--------------------------- + src/nm-core-utils.c | 37 ++++++++++++++++++++++++++++++++ + src/nm-core-utils.h | 2 ++ + 4 files changed, 45 insertions(+), 53 deletions(-) + +diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c +index dd1234d..aaa6a3e 100644 +--- a/src/dns-manager/nm-dns-dnsmasq.c ++++ b/src/dns-manager/nm-dns-dnsmasq.c +@@ -519,24 +519,6 @@ update (NMDnsPlugin *plugin, + + /****************************************************************/ + +-static const char * +-dm_exit_code_to_msg (int status) +-{ +- if (status == 1) +- return "Configuration problem"; +- else if (status == 2) +- return "Network access problem (address in use; permissions; etc)"; +- else if (status == 3) +- return "Filesystem problem (missing file/directory; permissions; etc)"; +- else if (status == 4) +- return "Memory allocation failure"; +- else if (status == 5) +- return "Other problem"; +- else if (status >= 11) +- return "Lease-script 'init' process failure"; +- return "Unknown error"; +-} +- + static void + child_quit (NMDnsPlugin *plugin, gint status) + { +@@ -547,9 +529,8 @@ child_quit (NMDnsPlugin *plugin, gint status) + if (WIFEXITED (status)) { + err = WEXITSTATUS (status); + if (err) { +- _LOGW ("dnsmasq exited with error: %s (%d)", +- dm_exit_code_to_msg (err), +- err); ++ _LOGW ("dnsmasq exited with error: %s", ++ nm_utils_dnsmasq_status_to_string (err, NULL, 0)); + } else + failed = FALSE; + } else if (WIFSTOPPED (status)) +diff --git a/src/dnsmasq-manager/nm-dnsmasq-manager.c b/src/dnsmasq-manager/nm-dnsmasq-manager.c +index 764aba2..12395db 100644 +--- a/src/dnsmasq-manager/nm-dnsmasq-manager.c ++++ b/src/dnsmasq-manager/nm-dnsmasq-manager.c +@@ -165,36 +165,6 @@ nm_cmd_line_add_string (NMCmdLine *cmd, const char *str) + /*******************************************/ + + static void +-dm_exit_code (guint dm_exit_status) +-{ +- char *msg = "Unknown error"; +- +- switch (dm_exit_status) { +- case 1: +- msg = "Configuration problem"; +- break; +- case 2: +- msg = "Network access problem (address in use; permissions; etc)"; +- break; +- case 3: +- msg = "Filesystem problem (missing file/directory; permissions; etc)"; +- break; +- case 4: +- msg = "Memory allocation failure"; +- break; +- case 5: +- msg = "Other problem"; +- break; +- default: +- if (dm_exit_status >= 11) +- msg = "Lease-script 'init' process failure"; +- break; +- } +- +- _LOGW ("dnsmasq exited with error: %s (%d)", msg, dm_exit_status); +-} +- +-static void + dm_watch_cb (GPid pid, gint status, gpointer user_data) + { + NMDnsMasqManager *manager = NM_DNSMASQ_MANAGER (user_data); +@@ -203,8 +173,10 @@ dm_watch_cb (GPid pid, gint status, gpointer user_data) + + if (WIFEXITED (status)) { + err = WEXITSTATUS (status); +- if (err != 0) +- dm_exit_code (err); ++ if (err != 0) { ++ _LOGW ("dnsmasq exited with error: %s", ++ nm_utils_dnsmasq_status_to_string (err, NULL, 0)); ++ } + } else if (WIFSTOPPED (status)) { + _LOGW ("dnsmasq stopped unexpectedly with signal %d", WSTOPSIG (status)); + } else if (WIFSIGNALED (status)) { +diff --git a/src/nm-core-utils.c b/src/nm-core-utils.c +index ef44a13..a2fbdfb 100644 +--- a/src/nm-core-utils.c ++++ b/src/nm-core-utils.c +@@ -3085,3 +3085,40 @@ nm_utils_lifetime_get (guint32 timestamp, + return TRUE; + } + ++const char * ++nm_utils_dnsmasq_status_to_string (int status, char *dest, guint size) ++{ ++ static char buffer[128]; ++ char *msg, *ret; ++ gs_free char *msg_free = NULL; ++ int len; ++ ++ if (status == 0) ++ msg = "Success"; ++ else if (status == 1) ++ msg = "Configuration problem"; ++ else if (status == 2) ++ msg = "Network access problem (address in use, permissions)"; ++ else if (status == 3) ++ msg = "Filesystem problem (missing file/directory, permissions)"; ++ else if (status == 4) ++ msg = "Memory allocation failure"; ++ else if (status == 5) ++ msg = "Other problem"; ++ else if (status >= 11) ++ msg = msg_free = g_strdup_printf ("Lease script failed with error %d", status - 10); ++ else ++ msg = "Unknown problem"; ++ ++ if (dest) { ++ ret = dest; ++ len = size; ++ } else { ++ ret = buffer; ++ len = sizeof (buffer); ++ } ++ ++ g_snprintf (ret, len, "%s (%d)", msg, status); ++ ++ return ret; ++} +diff --git a/src/nm-core-utils.h b/src/nm-core-utils.h +index ad0f995..b5083ac 100644 +--- a/src/nm-core-utils.h ++++ b/src/nm-core-utils.h +@@ -394,4 +394,6 @@ gboolean nm_utils_lifetime_get (guint32 timestamp, + + gboolean nm_utils_ip4_address_is_link_local (in_addr_t addr); + ++const char *nm_utils_dnsmasq_status_to_string (int status, char *dest, guint size); ++ + #endif /* __NM_CORE_UTILS_H__ */ +-- +2.5.5 + + +From 4e78e89ac35954d38ff107c42295b1418042a13c Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Mon, 30 May 2016 12:52:23 +0200 +Subject: [PATCH 5/6] dns: log when dnsmasq process exits normally + +(cherry picked from commit a64d70f0df586d398aa1bcd74be131ed6dc75450) +(cherry picked from commit 2deee5286726fb2933822e105ffce634df695b35) +--- + src/dns-manager/nm-dns-dnsmasq.c | 4 +++- + 1 file changed, 3 insertions(+), 1 deletion(-) + +diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c +index aaa6a3e..f8b2dd3 100644 +--- a/src/dns-manager/nm-dns-dnsmasq.c ++++ b/src/dns-manager/nm-dns-dnsmasq.c +@@ -531,8 +531,10 @@ child_quit (NMDnsPlugin *plugin, gint status) + if (err) { + _LOGW ("dnsmasq exited with error: %s", + nm_utils_dnsmasq_status_to_string (err, NULL, 0)); +- } else ++ } else { ++ _LOGD ("dnsmasq exited normally"); + failed = FALSE; ++ } + } else if (WIFSTOPPED (status)) + _LOGW ("dnsmasq stopped unexpectedly with signal %d", WSTOPSIG (status)); + else if (WIFSIGNALED (status)) +-- +2.5.5 + + +From 3061adfc7d962ef645f2844dfce7df5e359509b5 Mon Sep 17 00:00:00 2001 +From: Thomas Haller +Date: Mon, 30 May 2016 12:58:57 +0200 +Subject: [PATCH 6/6] dnsmasq: properly handling respawning of dnsmask + +Otherwise, when killing dnsmasq it does not get respawned: + + dnsmasq[0x560dd7e43cf0]: dnsmasq exited normally + dns-mgr: plugin dnsmasq child quit unexpectedly + dns-mgr: update-dns: updating resolv.conf + dns-mgr: config: 100 best v4 enp0s25 + dns-mgr: config: 100 best v6 enp0s25 + dns-mgr: config: 100 default v6 lo + dns-mgr: config: 100 default v4 lo + dns-mgr: update-dns: updating plugin dnsmasq + dnsmasq[0x560dd7e43cf0]: adding nameserver '192.168.0.2@enp0s25' + dnsmasq[0x560dd7e43cf0]: trying to update dnsmasq nameservers + dns-mgr: update-resolv-conf: write internal file /var/run/NetworkManager/resolv.conf succeeded but don't update /etc/resolv.conf as it points to resolv.conf.nm + dnsmasq[0x560dd7e43cf0]: dnsmasq disappeared + +Previously, we would create priv->dnsmasq proxy only once, +and not respawn the process at all. + +https://bugzilla.gnome.org/show_bug.cgi?id=766996 +(cherry picked from commit 2e7f4aeb60579b092641cc8d65973baecbd5335b) +(cherry picked from commit 1f8ba33d8716858cc27cf319c85e176bcf11afa3) +--- + src/dns-manager/nm-dns-dnsmasq.c | 21 ++++++++++++++++++--- + src/dns-manager/nm-dns-plugin.c | 11 +++++++++++ + src/dns-manager/nm-dns-plugin.h | 2 ++ + 3 files changed, 31 insertions(+), 3 deletions(-) + +diff --git a/src/dns-manager/nm-dns-dnsmasq.c b/src/dns-manager/nm-dns-dnsmasq.c +index f8b2dd3..a9fcc88 100644 +--- a/src/dns-manager/nm-dns-dnsmasq.c ++++ b/src/dns-manager/nm-dns-dnsmasq.c +@@ -410,11 +410,16 @@ start_dnsmasq (NMDnsDnsmasq *self) + NMBusManager *dbus_mgr; + GDBusConnection *connection; + ++ if (priv->running) { ++ /* the dnsmasq process is running. Nothing to do. */ ++ return; ++ } + +- if ( priv->running +- || priv->dnsmasq +- || priv->dnsmasq_cancellable) ++ if (nm_dns_plugin_child_pid ((NMDnsPlugin *) self) > 0) { ++ /* if we already have a child process spawned, don't do ++ * it again. */ + return; ++ } + + dm_binary = nm_utils_find_helper ("dnsmasq", DNSMASQ_PATH, NULL); + if (!dm_binary) { +@@ -446,6 +451,13 @@ start_dnsmasq (NMDnsDnsmasq *self) + if (!pid) + return; + ++ if ( priv->dnsmasq ++ || priv->dnsmasq_cancellable) { ++ /* we already have a proxy or are about to create it. ++ * We are done. */ ++ return; ++ } ++ + dbus_mgr = nm_bus_manager_get (); + g_return_if_fail (dbus_mgr); + +@@ -523,6 +535,7 @@ static void + child_quit (NMDnsPlugin *plugin, gint status) + { + NMDnsDnsmasq *self = NM_DNS_DNSMASQ (plugin); ++ NMDnsDnsmasqPrivate *priv = NM_DNS_DNSMASQ_GET_PRIVATE (self); + gboolean failed = TRUE; + int err; + +@@ -542,6 +555,8 @@ child_quit (NMDnsPlugin *plugin, gint status) + else + _LOGW ("dnsmasq died from an unknown cause"); + ++ priv->running = FALSE; ++ + if (failed) + g_signal_emit_by_name (self, NM_DNS_PLUGIN_FAILED); + } +diff --git a/src/dns-manager/nm-dns-plugin.c b/src/dns-manager/nm-dns-plugin.c +index d5cb882..f45b47f 100644 +--- a/src/dns-manager/nm-dns-plugin.c ++++ b/src/dns-manager/nm-dns-plugin.c +@@ -182,6 +182,17 @@ watch_cb (GPid pid, gint status, gpointer user_data) + } + + GPid ++nm_dns_plugin_child_pid (NMDnsPlugin *self) ++{ ++ NMDnsPluginPrivate *priv; ++ ++ g_return_val_if_fail (NM_IS_DNS_PLUGIN (self), 0); ++ ++ priv = NM_DNS_PLUGIN_GET_PRIVATE (self); ++ return priv->pid; ++} ++ ++GPid + nm_dns_plugin_child_spawn (NMDnsPlugin *self, + const char **argv, + const char *pidfile, +diff --git a/src/dns-manager/nm-dns-plugin.h b/src/dns-manager/nm-dns-plugin.h +index 7ecaa42..b328218 100644 +--- a/src/dns-manager/nm-dns-plugin.h ++++ b/src/dns-manager/nm-dns-plugin.h +@@ -111,6 +111,8 @@ GPid nm_dns_plugin_child_spawn (NMDnsPlugin *self, + const char *pidfile, + const char *kill_match); + ++GPid nm_dns_plugin_child_pid (NMDnsPlugin *self); ++ + gboolean nm_dns_plugin_child_kill (NMDnsPlugin *self); + + #endif /* __NETWORKMANAGER_DNS_PLUGIN_H__ */ +-- +2.5.5 + diff --git a/NetworkManager.spec b/NetworkManager.spec index e02fa31..6c5fc59 100644 --- a/NetworkManager.spec +++ b/NetworkManager.spec @@ -11,7 +11,7 @@ %global git_sha %{nil} %global rpm_version 1.2.2 %global real_version 1.2.2 -%global release_version 1 +%global release_version 2 %global epoch_version 1 %global obsoletes_nmver 1:0.9.9.95-1 @@ -97,6 +97,9 @@ Source1: NetworkManager.conf Source2: 00-server.conf Source3: 20-connectivity-fedora.conf +#Patch1: 0001-some.patch +Patch1: 0001-dnsmasq-clear-cache-and-restart-rh1338731.patch + Requires(post): systemd Requires(preun): systemd Requires(postun): systemd @@ -193,7 +196,7 @@ This package contains NetworkManager support for ADSL devices. Summary: Bluetooth device plugin for NetworkManager Group: System Environment/Base Requires: %{name}%{?_isa} = %{epoch}:%{version}-%{release} -Requires: NetworkManager-wwan +Requires: NetworkManager-wwan = %{epoch}:%{version}-%{release} Requires: bluez >= 4.101-5 Obsoletes: NetworkManager < %{obsoletes_nmver} Obsoletes: NetworkManager-bt @@ -336,6 +339,8 @@ by nm-connection-editor and nm-applet in a non-graphical environment. %prep %setup -q -n NetworkManager-%{real_version} +%patch1 -p1 + %build gtkdocize autoreconf --install --force @@ -637,6 +642,12 @@ fi %endif %changelog +* Thu Jun 2 2016 Thomas Haller - 1:1.2.2-2 +- dns: clear cache of dnsmasq when updating DNS configuration (rh#1338731) +- dns: fix restarting dnsmasq instance +- spec: depend bluetooth subpackage on exact wwan version +- all: fix some memleaks + * Wed May 11 2016 Lubomir Rintel - 1:1.2.2-1 - Update to NetworkManager 1.2.2 release