summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2018-04-13 16:36:41 +0200
committerThomas Haller <thaller@redhat.com>2018-04-18 14:10:32 +0200
commit20cacde95534244c304f6ccf917805e93a4cb922 (patch)
treeddd10344c0f116f84af6aa8690fc155f20c6590f
parenteb777a447122cbc1e92025518106dfeb862cffa4 (diff)
downloadNetworkManager-20cacde95534244c304f6ccf917805e93a4cb922.tar.gz
keyfile: avoid cloning the array while parsing DNS entries
-rw-r--r--libnm-core/nm-keyfile-reader.c42
-rw-r--r--src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_Connection2
-rw-r--r--src/settings/plugins/keyfile/tests/test-keyfile.c1
3 files changed, 26 insertions, 19 deletions
diff --git a/libnm-core/nm-keyfile-reader.c b/libnm-core/nm-keyfile-reader.c
index 19a6f33e5b..3c93b32d70 100644
--- a/libnm-core/nm-keyfile-reader.c
+++ b/libnm-core/nm-keyfile-reader.c
@@ -659,41 +659,47 @@ ip_address_or_route_parser (KeyfileReaderInfo *info, NMSetting *setting, const c
static void
ip_dns_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
{
- const char *setting_name = nm_setting_get_name (setting);
- int addr_family = nm_streq (setting_name, NM_SETTING_IP6_CONFIG_SETTING_NAME) ? AF_INET6 : AF_INET;
- GPtrArray *array = NULL;
- gsize length;
+ int addr_family;
gs_strfreev char **list = NULL;
- char **iter;
- int ret;
+ gsize i, n, length;
+
+ nm_assert (NM_IS_SETTING_IP4_CONFIG (setting) || NM_IS_SETTING_IP6_CONFIG (setting));
- list = nm_keyfile_plugin_kf_get_string_list (info->keyfile, setting_name, key, &length, NULL);
- if (!list || !g_strv_length (list))
+ list = nm_keyfile_plugin_kf_get_string_list (info->keyfile,
+ nm_setting_get_name (setting),
+ key,
+ &length,
+ NULL);
+ nm_assert (length == NM_PTRARRAY_LEN (list));
+ if (length == 0)
return;
- array = g_ptr_array_sized_new (length + 1);
+ addr_family = NM_IS_SETTING_IP4_CONFIG (setting) ? AF_INET : AF_INET6;
- for (iter = list; *iter; iter++) {
+ n = 0;
+ for (i = 0; i < length; i++) {
NMIPAddr addr;
- ret = inet_pton (addr_family, *iter, &addr);
- if (ret <= 0) {
+ if (inet_pton (addr_family, list[i], &addr) <= 0) {
if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
_("ignoring invalid DNS server IPv%c address '%s'"),
nm_utils_addr_family_to_char (addr_family),
- *iter)) {
- g_ptr_array_unref (array);
+ list[i])) {
+ do {
+ nm_clear_g_free (&list[i]);
+ } while (++i < length);
return;
}
+ nm_clear_g_free (&list[i]);
continue;
}
- g_ptr_array_add (array, *iter);
+ if (n != i)
+ list[n] = g_steal_pointer (&list[i]);
+ n++;
}
- g_ptr_array_add (array, NULL);
- g_object_set (setting, key, array->pdata, NULL);
- g_ptr_array_unref (array);
+ g_object_set (setting, key, list, NULL);
}
static void
diff --git a/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_Connection b/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_Connection
index a4dfaa50b6..1e62f4b3ef 100644
--- a/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_Connection
+++ b/src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_Connection
@@ -15,7 +15,7 @@ mtu=1400
[ipv4]
method=manual
-dns=4.2.2.1;4.2.2.2;
+dns=4.2.2.1;bogus;4.2.2.2;
addresses1=192.168.0.5;24;192.168.0.1;
addresses2=1.2.3.4;16;1.2.1.1;
address=2.3.4.5/24,2.3.4.6
diff --git a/src/settings/plugins/keyfile/tests/test-keyfile.c b/src/settings/plugins/keyfile/tests/test-keyfile.c
index ef266be2ed..b46475e8a8 100644
--- a/src/settings/plugins/keyfile/tests/test-keyfile.c
+++ b/src/settings/plugins/keyfile/tests/test-keyfile.c
@@ -235,6 +235,7 @@ test_read_valid_wired_connection (void)
NMTST_EXPECT_NM_INFO ("*ipv4.addresses:*semicolon at the end*addresses2*");
NMTST_EXPECT_NM_WARN ("*missing prefix length*address4*");
NMTST_EXPECT_NM_WARN ("*missing prefix length*address5*");
+ NMTST_EXPECT_NM_WARN ("*ipv4.dns: ignoring invalid DNS server IPv4 address 'bogus'*");
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes2*");
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes3*");
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes5*");