From 6e990cf97bf20a27a9be1d1dc4650502ba29c343 Mon Sep 17 00:00:00 2001 From: Beniamino Galvani Date: Tue, 1 Dec 2015 16:55:34 +0100 Subject: [PATCH] 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 --- src/nm-ip4-config.c | 25 ++++++++++++++++++++----- src/nm-ip6-config.c | 25 ++++++++++++++++++++----- src/tests/test-ip4-config.c | 22 ++++++++++++++++++++++ src/tests/test-ip6-config.c | 22 ++++++++++++++++++++++ 4 files changed, 84 insertions(+), 10 deletions(-) diff --git a/src/nm-ip4-config.c b/src/nm-ip4-config.c index 67669bddb1..794f4e9ec4 100644 --- a/src/nm-ip4-config.c +++ b/src/nm-ip4-config.c @@ -1707,16 +1707,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); - g_ptr_array_add (priv->searches, 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, search); _NOTIFY (config, PROP_SEARCHES); } diff --git a/src/nm-ip6-config.c b/src/nm-ip6-config.c index 51e8e121a7..51f3550603 100644 --- a/src/nm-ip6-config.c +++ b/src/nm-ip6-config.c @@ -1633,16 +1633,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); - g_ptr_array_add (priv->searches, 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, search); _NOTIFY (config, PROP_SEARCHES); } diff --git a/src/tests/test-ip4-config.c b/src/tests/test-ip4-config.c index 58fe213b5a..16cd3d1ef1 100644 --- a/src/tests/test-ip4-config.c +++ b/src/tests/test-ip4-config.c @@ -340,6 +340,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 (1); + + 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); +} + /*******************************************/ NMTST_DEFINE (); @@ -354,6 +375,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 0977ded43b..2639a1f0d2 100644 --- a/src/tests/test-ip6-config.c +++ b/src/tests/test-ip6-config.c @@ -320,6 +320,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 (1); + + 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(); @@ -334,6 +355,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 (); }