diff options
author | Thomas Haller <thaller@redhat.com> | 2018-04-13 16:36:41 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2018-04-18 14:10:32 +0200 |
commit | 20cacde95534244c304f6ccf917805e93a4cb922 (patch) | |
tree | ddd10344c0f116f84af6aa8690fc155f20c6590f | |
parent | eb777a447122cbc1e92025518106dfeb862cffa4 (diff) | |
download | NetworkManager-20cacde95534244c304f6ccf917805e93a4cb922.tar.gz |
keyfile: avoid cloning the array while parsing DNS entries
-rw-r--r-- | libnm-core/nm-keyfile-reader.c | 42 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/tests/keyfiles/Test_Wired_Connection | 2 | ||||
-rw-r--r-- | src/settings/plugins/keyfile/tests/test-keyfile.c | 1 |
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*"); |