diff options
author | Thomas Haller <thaller@redhat.com> | 2017-04-26 19:05:54 +0200 |
---|---|---|
committer | Thomas Haller <thaller@redhat.com> | 2017-04-26 19:08:55 +0200 |
commit | 3876b10a4749638c3dcfa7e65b12bfee8030334c (patch) | |
tree | e83c32c979486e596654eb371612fb3efcf112ff | |
parent | f04bf45e84bddb7d685b03b9b36088848a46e75d (diff) | |
download | NetworkManager-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.c | 26 |
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; } /** |