summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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 ();
}