core: truncate parent ifname when constructing virtual ifname for VLAN

https://bugzilla.redhat.com/show_bug.cgi?id=1300755
This commit is contained in:
Thomas Haller
2016-01-21 17:58:21 +01:00
parent 944065c115
commit 778207f23e
2 changed files with 69 additions and 2 deletions

View File

@@ -2141,8 +2141,32 @@ nm_utils_complete_generic (NMConnection *connection,
char * char *
nm_utils_new_vlan_name (const char *parent_iface, guint32 vlan_id) nm_utils_new_vlan_name (const char *parent_iface, guint32 vlan_id)
{ {
/* Basically VLAN_NAME_TYPE_RAW_PLUS_VID_NO_PAD */ guint id_len;
return g_strdup_printf ("%s.%d", parent_iface, vlan_id); gsize parent_len;
char *ifname;
g_return_val_if_fail (parent_iface && *parent_iface, NULL);
if (vlan_id < 10) {
g_return_val_if_fail (vlan_id > 0, NULL);
id_len = 2;
} else if (vlan_id < 100)
id_len = 3;
else if (vlan_id < 1000)
id_len = 4;
else {
g_return_val_if_fail (vlan_id < 4096, NULL);
id_len = 5;
}
ifname = g_new (char, IFNAMSIZ);
parent_len = strlen (parent_iface);
parent_len = MIN (parent_len, IFNAMSIZ - 1 - id_len);
memcpy (ifname, parent_iface, parent_len);
g_snprintf (&ifname[parent_len], IFNAMSIZ - parent_len, ".%u", vlan_id);
return ifname;
} }
/** /**

View File

@@ -855,6 +855,48 @@ test_nm_multi_index (void)
/*******************************************/ /*******************************************/
static void
test_nm_utils_new_vlan_name (void)
{
guint i, j;
const char *parent_names[] = {
"a",
"a2",
"a23",
"a23456789",
"a2345678901",
"a23456789012",
"a234567890123",
"a2345678901234",
"a23456789012345",
"a234567890123456",
"a2345678901234567",
};
for (i = 0; i < G_N_ELEMENTS (parent_names); i++) {
for (j = 0; j < 10; j++) {
gs_free char *ifname = NULL;
gs_free char *vlan_id_s = NULL;
guint vlan_id;
vlan_id = nmtst_get_rand_int () % 4096;
vlan_id_s = g_strdup_printf (".%d", vlan_id);
ifname = nm_utils_new_vlan_name (parent_names[i], vlan_id);
g_assert (ifname && ifname[0]);
g_assert_cmpint (strlen (ifname), ==, MIN (15, strlen (parent_names[i]) + strlen (vlan_id_s)));
g_assert (g_str_has_suffix (ifname, vlan_id_s));
g_assert (ifname[strlen (ifname) - strlen (vlan_id_s)] == '.');
g_assert (strncmp (ifname, parent_names[i], strlen (ifname) - strlen (vlan_id_s)) == 0);
if (!g_str_has_prefix (ifname, parent_names[i]))
g_assert_cmpint (strlen (ifname), ==, 15);
}
}
}
/*******************************************/
NMTST_DEFINE (); NMTST_DEFINE ();
int int
@@ -867,6 +909,7 @@ main (int argc, char **argv)
g_test_add_func ("/general/nm_utils_array_remove_at_indexes", test_nm_utils_array_remove_at_indexes); g_test_add_func ("/general/nm_utils_array_remove_at_indexes", test_nm_utils_array_remove_at_indexes);
g_test_add_func ("/general/nm_ethernet_address_is_valid", test_nm_ethernet_address_is_valid); g_test_add_func ("/general/nm_ethernet_address_is_valid", test_nm_ethernet_address_is_valid);
g_test_add_func ("/general/nm_multi_index", test_nm_multi_index); g_test_add_func ("/general/nm_multi_index", test_nm_multi_index);
g_test_add_func ("/general/nm_utils_new_vlan_name", test_nm_utils_new_vlan_name);
return g_test_run (); return g_test_run ();
} }