core: ignore host-routes routes when matching generated connection
When we generate the connection in nm_device_generate_connection(), we add all routes that have rt_source (roundtrip(NM_IP_CONFIG_SOURCE_USER)). Especially since commite470e13922
, this includes automatically added host-routes to the gateway, added by ip4_config_merge_and_apply(). Later, during nm_utils_match_connection() this route most not prevent matching. Either nm_device_generate_connection() should not add it, or nm_utils_match_connection() should ignore it. I think adjusting the matching is better, because ip-configs are used for several things, including exposing routes on D-Bus. We don't want to hide this route on D-Bus. Fixes:e470e13922
https://bugzilla.redhat.com/show_bug.cgi?id=1487384
This commit is contained in:
@@ -392,12 +392,14 @@ check_ip_routes (NMConnection *orig,
|
|||||||
gint64 default_metric,
|
gint64 default_metric,
|
||||||
gboolean v4)
|
gboolean v4)
|
||||||
{
|
{
|
||||||
gs_free NMIPRoute **routes1 = NULL, **routes2 = NULL;
|
gs_free NMIPRoute **routes1 = NULL;
|
||||||
|
NMIPRoute **routes2;
|
||||||
NMSettingIPConfig *s_ip1, *s_ip2;
|
NMSettingIPConfig *s_ip1, *s_ip2;
|
||||||
gint64 m;
|
gint64 m;
|
||||||
const char *s_name;
|
const char *s_name;
|
||||||
GHashTable *props;
|
GHashTable *props;
|
||||||
guint i, num;
|
guint i, i1, i2, num1, num2;
|
||||||
|
const guint8 PLEN = v4 ? 32 : 128;
|
||||||
|
|
||||||
s_name = v4 ? NM_SETTING_IP4_CONFIG_SETTING_NAME :
|
s_name = v4 ? NM_SETTING_IP4_CONFIG_SETTING_NAME :
|
||||||
NM_SETTING_IP6_CONFIG_SETTING_NAME;
|
NM_SETTING_IP6_CONFIG_SETTING_NAME;
|
||||||
@@ -414,27 +416,49 @@ check_ip_routes (NMConnection *orig,
|
|||||||
if (!s_ip1 || !s_ip2)
|
if (!s_ip1 || !s_ip2)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
|
|
||||||
num = nm_setting_ip_config_get_num_routes (s_ip1);
|
num1 = nm_setting_ip_config_get_num_routes (s_ip1);
|
||||||
if (num != nm_setting_ip_config_get_num_routes (s_ip2))
|
num2 = nm_setting_ip_config_get_num_routes (s_ip2);
|
||||||
return FALSE;
|
|
||||||
|
|
||||||
routes1 = g_new (NMIPRoute *, num);
|
routes1 = g_new (NMIPRoute *, (gsize) num1 + num2);
|
||||||
routes2 = g_new (NMIPRoute *, num);
|
routes2 = &routes1[num1];
|
||||||
|
|
||||||
for (i = 0; i < num; i++) {
|
for (i = 0; i < num1; i++)
|
||||||
routes1[i] = nm_setting_ip_config_get_route (s_ip1, i);
|
routes1[i] = nm_setting_ip_config_get_route (s_ip1, i);
|
||||||
|
for (i = 0; i < num2; i++)
|
||||||
routes2[i] = nm_setting_ip_config_get_route (s_ip2, i);
|
routes2[i] = nm_setting_ip_config_get_route (s_ip2, i);
|
||||||
}
|
|
||||||
|
|
||||||
m = nm_setting_ip_config_get_route_metric (s_ip2);
|
m = nm_setting_ip_config_get_route_metric (s_ip2);
|
||||||
if (m != -1)
|
if (m != -1)
|
||||||
default_metric = m;
|
default_metric = m;
|
||||||
|
|
||||||
g_qsort_with_data (routes1, num, sizeof (NMIPRoute *), route_ptr_compare, &default_metric);
|
g_qsort_with_data (routes1, num1, sizeof (NMIPRoute *), route_ptr_compare, &default_metric);
|
||||||
g_qsort_with_data (routes2, num, sizeof (NMIPRoute *), route_ptr_compare, &default_metric);
|
g_qsort_with_data (routes2, num2, sizeof (NMIPRoute *), route_ptr_compare, &default_metric);
|
||||||
|
|
||||||
for (i = 0; i < num; i++) {
|
for (i1 = 0, i2 = 0; i2 < num2; i1++) {
|
||||||
if (route_compare (routes1[i], routes2[i], default_metric))
|
if (i1 >= num1)
|
||||||
|
return FALSE;
|
||||||
|
if (route_compare (routes1[i1], routes2[i2], default_metric) == 0) {
|
||||||
|
i2++;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* if @orig (@routes1) contains /32 routes that are missing in @candidate,
|
||||||
|
* we accept that.
|
||||||
|
*
|
||||||
|
* A /32 may have been added automatically, as a direct-route to the gateway.
|
||||||
|
* The generated connection (@orig) would contain that route, so we shall ignore
|
||||||
|
* it.
|
||||||
|
*
|
||||||
|
* Likeweise for /128 for IPv6. */
|
||||||
|
if (nm_ip_route_get_prefix (routes1[i1]) == PLEN)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* check that @orig has no left-over (except host routes that we ignore). */
|
||||||
|
for (; i1 < num1; i1++) {
|
||||||
|
if (nm_ip_route_get_prefix (routes1[i1]) != PLEN)
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user