diff --git a/NetworkManager.spec b/NetworkManager.spec index db6b91d..9208bff 100644 --- a/NetworkManager.spec +++ b/NetworkManager.spec @@ -20,7 +20,7 @@ Name: NetworkManager Summary: Network connection manager and user applications Epoch: 1 Version: 0.8.1 -Release: 6%{snapshot}%{?dist} +Release: 7%{snapshot}%{?dist} Group: System Environment/Base License: GPLv2+ URL: http://www.gnome.org/projects/NetworkManager/ @@ -31,6 +31,7 @@ Source2: NetworkManager.conf Patch1: nm-applet-internal-buildfixes.patch Patch2: explain-dns1-dns2.patch Patch3: nm-applet-no-notifications.patch +Patch4: nm-remove-stale-hosts-mappings.patch BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n) Requires(post): chkconfig @@ -161,6 +162,7 @@ tar -xjf %{SOURCE1} %patch1 -p1 -b .buildfix %patch2 -p1 -b .explain-dns1-dns2 %patch3 -p1 -b .no-notifications +%patch4 -p1 -b .remove-stale-hosts-mappings %build @@ -414,6 +416,9 @@ fi %{_datadir}/gtk-doc/html/libnm-util/* %changelog +* Thu Oct 7 2010 Dan Williams - 0.8.1-7 +- core: remove stale /etc/hosts mappings (rh #630146) + * Tue Aug 31 2010 Dan Williams - 0.8.1-6 - core: add dispatcher events on DHCPv4 and DHCPv6 lease changes - core: enforce access permissions when enabling/disabling WiFi and WWAN (rh #626337) diff --git a/nm-remove-stale-hosts-mappings.patch b/nm-remove-stale-hosts-mappings.patch new file mode 100644 index 0000000..8cffea7 --- /dev/null +++ b/nm-remove-stale-hosts-mappings.patch @@ -0,0 +1,112 @@ +commit 97de44c9a730fbb5a08d27e6899f7caffb015e66 +Author: Dan Williams +Date: Thu Oct 7 00:29:44 2010 -0500 + + policy: ensure stale IP mappings are not left in /etc/hosts (bgo #629020) (rh #630146) + + NM-added mappings for active IP addresses were not getting properly + removed when the address disappeared of NM quit, because the bits + of code that determine whether or not /etc/hosts should change were + not taking the disappearance of the IP address into account, and + were leaving the file unchanged. + + To fix that, if there is no default IP address, but there are NM-added + IP address entries in /etc/hosts, make sure we update /etc/hosts and + remove them. + +diff --git a/src/nm-policy-hosts.c b/src/nm-policy-hosts.c +index 0403b03..1b57d42 100644 +--- a/src/nm-policy-hosts.c ++++ b/src/nm-policy-hosts.c +@@ -64,6 +64,21 @@ is_local_mapping (const char *str, gboolean ip6, const char *hostname) + } + + static gboolean ++is_ip4_addr (const char *str) ++{ ++ struct in_addr found; ++ char buf[INET_ADDRSTRLEN + 2]; ++ const char *p = str; ++ guint32 i = 0; ++ ++ memset (buf, 0, sizeof (buf)); ++ while (*p && !isblank (*p) && (i < sizeof (buf))) ++ buf[i++] = *p++; ++ ++ return inet_pton (AF_INET, buf, &found) == 1 ? TRUE : FALSE; ++} ++ ++static gboolean + ip4_addr_matches (const char *str, const char *ip4_addr) + { + struct in_addr found, given; +@@ -86,6 +101,21 @@ ip4_addr_matches (const char *str, const char *ip4_addr) + } + + static gboolean ++is_ip6_addr (const char *str) ++{ ++ struct in6_addr found; ++ char buf[INET6_ADDRSTRLEN + 2]; ++ const char *p = str; ++ guint32 i = 0; ++ ++ memset (buf, 0, sizeof (buf)); ++ while (*p && !isblank (*p) && (i < sizeof (buf))) ++ buf[i++] = *p++; ++ ++ return inet_pton (AF_INET6, buf, &found) == 1 ? TRUE : FALSE; ++} ++ ++static gboolean + ip6_addr_matches (const char *str, const char *ip6_addr) + { + struct in6_addr found, given; +@@ -176,7 +206,14 @@ nm_policy_get_etc_hosts (const char **lines, + found_user_host4 = TRUE; + host4_before = TRUE; /* Ignore if user added mapping manually */ + } ++ } else if (!ip4_addr && strstr (*line, ADDED_TAG)) { ++ /* If this is a stale NM-added IPv4 entry we need to remove it, ++ * so make sure we update /etc/hosts. ++ */ ++ if (is_ip4_addr (*line)) ++ found_host4 = FALSE; + } ++ + if (ip6_addr && ip6_addr_matches (*line, ip6_addr)) { + found_host6 = TRUE; + if (strstr (*line, ADDED_TAG)) { +@@ -186,6 +223,12 @@ nm_policy_get_etc_hosts (const char **lines, + found_user_host6 = TRUE; + host6_before = TRUE; /* Ignore if user added mapping manually */ + } ++ } else if (!ip6_addr && strstr (*line, ADDED_TAG)) { ++ /* If this is a stale NM-added IPv6 entry we need to remove it, ++ * so make sure we update /etc/hosts. ++ */ ++ if (is_ip6_addr (*line)) ++ found_host6 = FALSE; + } + } + +diff --git a/src/nm-policy.c b/src/nm-policy.c +index 3ab4db5..7382ece 100644 +--- a/src/nm-policy.c ++++ b/src/nm-policy.c +@@ -1234,6 +1234,15 @@ nm_policy_destroy (NMPolicy *policy) + } + g_slist_free (policy->dev_signal_ids); + ++ /* Rewrite /etc/hosts on exit to ensure we don't leave stale IP addresses ++ * lying around. FIXME: this will take out a valid IP address of an ++ * ethernet device we're leaving active (ie, a connection we can "assume" ++ * when NM starts again). ++ */ ++ policy->default_device4 = NULL; ++ policy->default_device6 = NULL; ++ update_system_hostname (policy, NULL, NULL); ++ + g_free (policy->orig_hostname); + g_free (policy->cur_hostname); +