summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2015-12-01 16:55:34 +0100
committerBeniamino Galvani <bgalvani@redhat.com>2015-12-05 10:08:15 +0100
commit83f4c1c9bf3f86b1f08a6f3f187df1f3987b103d (patch)
treec19211f1fec97a6df72be9ec8887a080b7e779ac
parentdd088ed595197662f89a9c5ddadd5e7fbfe66544 (diff)
downloadNetworkManager-83f4c1c9bf3f86b1f08a6f3f187df1f3987b103d.tar.gz
core: strip trailing dot from domain search list
dhclient adds a trailing dot to domain search list entries received from the server, while the same domains received by other means (dhcpcd on RA) don't have the final dot. The result is that resolv.conf can be populated with duplicated entries. Fix this by stripping the trailing dot when a new search domain is added to a IP configuration. https://bugzilla.gnome.org/show_bug.cgi?id=758777 (cherry picked from commit 6e990cf97bf20a27a9be1d1dc4650502ba29c343)
-rw-r--r--src/nm-ip4-config.c25
-rw-r--r--src/nm-ip6-config.c26
-rw-r--r--src/tests/test-ip4-config.c22
-rw-r--r--src/tests/test-ip6-config.c22
4 files changed, 85 insertions, 10 deletions
diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c
index 55d308a3fb..f625d35078 100644
--- a/src/nm-ip4-config.c
+++ b/src/nm-ip4-config.c
@@ -1632,16 +1632,31 @@ void
nm_ip4_config_add_search (NMIP4Config *config, const char *new)
{
NMIP4ConfigPrivate *priv = NM_IP4_CONFIG_GET_PRIVATE (config);
- int i;
+ char *search;
+ size_t len;
g_return_if_fail (new != NULL);
g_return_if_fail (new[0] != '\0');
- for (i = 0; i < priv->searches->len; i++)
- if (!g_strcmp0 (g_ptr_array_index (priv->searches, i), new))
- return;
+ search = g_strdup (new);
+
+ /* Remove trailing dot as it has no effect */
+ len = strlen (search);
+ if (search[len - 1] == '.')
+ search[len - 1] = 0;
+
+ if (!search[0]) {
+ g_free (search);
+ return;
+ }
+
+ if (_nm_utils_strv_find_first ((char **) priv->searches->pdata,
+ priv->searches->len, search) >= 0) {
+ g_free (search);
+ return;
+ }
- g_ptr_array_add (priv->searches, g_strdup (new));
+ g_ptr_array_add (priv->searches, search);
_NOTIFY (config, PROP_SEARCHES);
}
diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c
index ef2562311e..f68c4339e5 100644
--- a/src/nm-ip6-config.c
+++ b/src/nm-ip6-config.c
@@ -35,6 +35,7 @@
#include "nm-route-manager.h"
#include "NetworkManagerUtils.h"
#include "nm-macros-internal.h"
+#include "nm-core-internal.h"
G_DEFINE_TYPE (NMIP6Config, nm_ip6_config, G_TYPE_OBJECT)
@@ -1553,16 +1554,31 @@ void
nm_ip6_config_add_search (NMIP6Config *config, const char *new)
{
NMIP6ConfigPrivate *priv = NM_IP6_CONFIG_GET_PRIVATE (config);
- int i;
+ char *search;
+ size_t len;
g_return_if_fail (new != NULL);
g_return_if_fail (new[0] != '\0');
- for (i = 0; i < priv->searches->len; i++)
- if (!g_strcmp0 (g_ptr_array_index (priv->searches, i), new))
- return;
+ search = g_strdup (new);
+
+ /* Remove trailing dot as it has no effect */
+ len = strlen (search);
+ if (search[len - 1] == '.')
+ search[len - 1] = 0;
+
+ if (!search[0]) {
+ g_free (search);
+ return;
+ }
+
+ if (_nm_utils_strv_find_first ((char **) priv->searches->pdata,
+ priv->searches->len, search) >= 0) {
+ g_free (search);
+ return;
+ }
- g_ptr_array_add (priv->searches, g_strdup (new));
+ g_ptr_array_add (priv->searches, search);
_NOTIFY (config, PROP_SEARCHES);
}
diff --git a/src/tests/test-ip4-config.c b/src/tests/test-ip4-config.c
index 235cfd426f..404940d405 100644
--- a/src/tests/test-ip4-config.c
+++ b/src/tests/test-ip4-config.c
@@ -336,6 +336,27 @@ test_merge_subtract_mss_mtu (void)
g_object_unref (cfg3);
}
+static void
+test_strip_search_trailing_dot (void)
+{
+ NMIP4Config *config;
+
+ config = nm_ip4_config_new ();
+
+ nm_ip4_config_add_search (config, ".");
+ nm_ip4_config_add_search (config, "foo");
+ nm_ip4_config_add_search (config, "bar.");
+ nm_ip4_config_add_search (config, "baz.com");
+ nm_ip4_config_add_search (config, "baz.com.");
+
+ g_assert_cmpuint (nm_ip4_config_get_num_searches (config), ==, 3);
+ g_assert_cmpstr (nm_ip4_config_get_search (config, 0), ==, "foo");
+ g_assert_cmpstr (nm_ip4_config_get_search (config, 1), ==, "bar");
+ g_assert_cmpstr (nm_ip4_config_get_search (config, 2), ==, "baz.com");
+
+ g_object_unref (config);
+}
+
/*******************************************/
int
@@ -352,6 +373,7 @@ main (int argc, char **argv)
g_test_add_func ("/ip4-config/add-address-with-source", test_add_address_with_source);
g_test_add_func ("/ip4-config/add-route-with-source", test_add_route_with_source);
g_test_add_func ("/ip4-config/merge-subtract-mss-mtu", test_merge_subtract_mss_mtu);
+ g_test_add_func ("/ip4-config/strip-search-trailing-dot", test_strip_search_trailing_dot);
return g_test_run ();
}
diff --git a/src/tests/test-ip6-config.c b/src/tests/test-ip6-config.c
index 9e1d5651d3..a5397b8a47 100644
--- a/src/tests/test-ip6-config.c
+++ b/src/tests/test-ip6-config.c
@@ -321,6 +321,27 @@ test_nm_ip6_config_addresses_sort (void)
g_object_unref (config);
}
+static void
+test_strip_search_trailing_dot (void)
+{
+ NMIP6Config *config;
+
+ config = nm_ip6_config_new ();
+
+ nm_ip6_config_add_search (config, ".");
+ nm_ip6_config_add_search (config, "foo");
+ nm_ip6_config_add_search (config, "bar.");
+ nm_ip6_config_add_search (config, "baz.com");
+ nm_ip6_config_add_search (config, "baz.com.");
+
+ g_assert_cmpuint (nm_ip6_config_get_num_searches (config), ==, 3);
+ g_assert_cmpstr (nm_ip6_config_get_search (config, 0), ==, "foo");
+ g_assert_cmpstr (nm_ip6_config_get_search (config, 1), ==, "bar");
+ g_assert_cmpstr (nm_ip6_config_get_search (config, 2), ==, "baz.com");
+
+ g_object_unref (config);
+}
+
/*******************************************/
NMTST_DEFINE();
@@ -335,6 +356,7 @@ main (int argc, char **argv)
g_test_add_func ("/ip6-config/add-address-with-source", test_add_address_with_source);
g_test_add_func ("/ip6-config/add-route-with-source", test_add_route_with_source);
g_test_add_func ("/ip6-config/test_nm_ip6_config_addresses_sort", test_nm_ip6_config_addresses_sort);
+ g_test_add_func ("/ip6-config/strip-search-trailing-dot", test_strip_search_trailing_dot);
return g_test_run ();
}