keyfile: avoid cloning the array while parsing DNS entries

This commit is contained in:
Thomas Haller
2018-04-13 16:36:41 +02:00
parent 23b0655ceb
commit c858f9d351
3 changed files with 26 additions and 19 deletions

View File

@@ -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;
list = nm_keyfile_plugin_kf_get_string_list (info->keyfile, setting_name, key, &length, NULL);
if (!list || !g_strv_length (list))
nm_assert (NM_IS_SETTING_IP4_CONFIG (setting) || NM_IS_SETTING_IP6_CONFIG (setting));
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

View File

@@ -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

View File

@@ -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*");