summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2017-04-26 19:05:54 +0200
committerThomas Haller <thaller@redhat.com>2017-04-26 19:08:55 +0200
commit3876b10a4749638c3dcfa7e65b12bfee8030334c (patch)
treee83c32c979486e596654eb371612fb3efcf112ff
parentf04bf45e84bddb7d685b03b9b36088848a46e75d (diff)
downloadNetworkManager-3876b10a4749638c3dcfa7e65b12bfee8030334c.tar.gz
device: fix restricting Generic connection by interface-name
NMDeviceGeneric:check_connection_compatible() doesn't check for a matching interface name. It relies on the parent implementation to do that. The parent implementation calls nm_manager_get_connection_iface(). That fails for NM_SETTING_GENERIC_SETTING_NAME, because that one has no factory. Maybe this imbalance of having no factory for the Generic device is wrong, but usually factories only match a distinct set of device types, while the generic factory would handle them all (as last resort). Without this, activating a generic connection might activate the wrong interface.
-rw-r--r--src/nm-manager.c26
1 files changed, 17 insertions, 9 deletions
diff --git a/src/nm-manager.c b/src/nm-manager.c
index 2490025574..093a2a4fd3 100644
--- a/src/nm-manager.c
+++ b/src/nm-manager.c
@@ -1144,6 +1144,11 @@ nm_manager_get_connection_iface (NMManager *self,
factory = nm_device_factory_manager_find_factory_for_connection (connection);
if (!factory) {
+ if (nm_streq0 (nm_connection_get_connection_type (connection), NM_SETTING_GENERIC_SETTING_NAME)) {
+ /* the generic type doesn't have a factory. */
+ goto return_ifname_fom_connection;
+ }
+
g_set_error (error,
NM_MANAGER_ERROR,
NM_MANAGER_ERROR_FAILED,
@@ -1155,15 +1160,7 @@ nm_manager_get_connection_iface (NMManager *self,
if ( !out_parent
&& !NM_DEVICE_FACTORY_GET_CLASS (factory)->get_connection_iface) {
/* optimization. Shortcut lookup of the partent device. */
- iface = g_strdup (nm_connection_get_interface_name (connection));
- if (!iface) {
- g_set_error (error,
- NM_MANAGER_ERROR,
- NM_MANAGER_ERROR_FAILED,
- "failed to determine interface name: error determine name for %s",
- nm_connection_get_connection_type (connection));
- }
- return iface;
+ goto return_ifname_fom_connection;
}
parent = find_parent_device_for_connection (self, connection, factory);
@@ -1177,6 +1174,17 @@ nm_manager_get_connection_iface (NMManager *self,
if (out_parent)
*out_parent = parent;
return iface;
+
+return_ifname_fom_connection:
+ iface = g_strdup (nm_connection_get_interface_name (connection));
+ if (!iface) {
+ g_set_error (error,
+ NM_MANAGER_ERROR,
+ NM_MANAGER_ERROR_FAILED,
+ "failed to determine interface name: error determine name for %s",
+ nm_connection_get_connection_type (connection));
+ }
+ return iface;
}
/**