diff options
-rw-r--r-- | src/nm-ip4-config.c | 25 | ||||
-rw-r--r-- | src/nm-ip6-config.c | 26 | ||||
-rw-r--r-- | src/tests/test-ip4-config.c | 22 | ||||
-rw-r--r-- | src/tests/test-ip6-config.c | 22 |
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 (); } |