keyfile: avoid cloning the array while parsing DNS entries
This commit is contained in:
@@ -659,41 +659,47 @@ ip_address_or_route_parser (KeyfileReaderInfo *info, NMSetting *setting, const c
|
|||||||
static void
|
static void
|
||||||
ip_dns_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
|
ip_dns_parser (KeyfileReaderInfo *info, NMSetting *setting, const char *key)
|
||||||
{
|
{
|
||||||
const char *setting_name = nm_setting_get_name (setting);
|
int addr_family;
|
||||||
int addr_family = nm_streq (setting_name, NM_SETTING_IP6_CONFIG_SETTING_NAME) ? AF_INET6 : AF_INET;
|
|
||||||
GPtrArray *array = NULL;
|
|
||||||
gsize length;
|
|
||||||
gs_strfreev char **list = NULL;
|
gs_strfreev char **list = NULL;
|
||||||
char **iter;
|
gsize i, n, length;
|
||||||
int ret;
|
|
||||||
|
|
||||||
list = nm_keyfile_plugin_kf_get_string_list (info->keyfile, setting_name, key, &length, NULL);
|
nm_assert (NM_IS_SETTING_IP4_CONFIG (setting) || NM_IS_SETTING_IP6_CONFIG (setting));
|
||||||
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;
|
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;
|
NMIPAddr addr;
|
||||||
|
|
||||||
ret = inet_pton (addr_family, *iter, &addr);
|
if (inet_pton (addr_family, list[i], &addr) <= 0) {
|
||||||
if (ret <= 0) {
|
|
||||||
if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
|
if (!handle_warn (info, key, NM_KEYFILE_WARN_SEVERITY_WARN,
|
||||||
_("ignoring invalid DNS server IPv%c address '%s'"),
|
_("ignoring invalid DNS server IPv%c address '%s'"),
|
||||||
nm_utils_addr_family_to_char (addr_family),
|
nm_utils_addr_family_to_char (addr_family),
|
||||||
*iter)) {
|
list[i])) {
|
||||||
g_ptr_array_unref (array);
|
do {
|
||||||
|
nm_clear_g_free (&list[i]);
|
||||||
|
} while (++i < length);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
nm_clear_g_free (&list[i]);
|
||||||
continue;
|
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_object_set (setting, key, list, NULL);
|
||||||
g_ptr_array_unref (array);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
@@ -15,7 +15,7 @@ mtu=1400
|
|||||||
|
|
||||||
[ipv4]
|
[ipv4]
|
||||||
method=manual
|
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;
|
addresses1=192.168.0.5;24;192.168.0.1;
|
||||||
addresses2=1.2.3.4;16;1.2.1.1;
|
addresses2=1.2.3.4;16;1.2.1.1;
|
||||||
address=2.3.4.5/24,2.3.4.6
|
address=2.3.4.5/24,2.3.4.6
|
||||||
|
@@ -235,6 +235,7 @@ test_read_valid_wired_connection (void)
|
|||||||
NMTST_EXPECT_NM_INFO ("*ipv4.addresses:*semicolon at the end*addresses2*");
|
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*address4*");
|
||||||
NMTST_EXPECT_NM_WARN ("*missing prefix length*address5*");
|
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*routes2*");
|
||||||
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes3*");
|
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes3*");
|
||||||
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes5*");
|
NMTST_EXPECT_NM_INFO ("*ipv4.routes*semicolon at the end*routes5*");
|
||||||
|
Reference in New Issue
Block a user