From 2dac2cf56e0588af2706e3049409b7bd2afe7010 Mon Sep 17 00:00:00 2001 From: Dan Williams Date: Wed, 30 Jan 2013 12:52:42 -0600 Subject: [PATCH] core: don't allow auto-activation of a master that has been disconnected The master-activation code was ignoring whether or not the master device was inhibiting automatic connections. --- src/nm-manager.c | 42 ++++++++++++++++++++++++++++++------------ src/nm-manager.h | 1 + 2 files changed, 31 insertions(+), 12 deletions(-) diff --git a/src/nm-manager.c b/src/nm-manager.c index fbc9d23d30..e1234ab0d5 100644 --- a/src/nm-manager.c +++ b/src/nm-manager.c @@ -2529,6 +2529,8 @@ ensure_master_active_connection (NMManager *self, nm_device_get_path (master_device), dbus_sender, error); + if (!master_ac) + g_prefix_error (error, "%s", "Master device activation failed: "); g_slist_free (connections); return master_ac; } @@ -2569,24 +2571,30 @@ ensure_master_active_connection (NMManager *self, if (master_state != NM_DEVICE_STATE_DISCONNECTED) continue; - return nm_manager_activate_connection (self, - master_connection, - NULL, - nm_device_get_path (candidate), - dbus_sender, - error); + master_ac = nm_manager_activate_connection (self, + master_connection, + NULL, + nm_device_get_path (candidate), + dbus_sender, + error); + if (!master_ac) + g_prefix_error (error, "%s", "Master device activation failed: "); + return master_ac; } /* Device described by master_connection may be a virtual one that's * not created yet. */ if (!found_device && connection_needs_virtual_device (master_connection)) { - return nm_manager_activate_connection (self, - master_connection, - NULL, - NULL, - dbus_sender, - error); + master_ac = nm_manager_activate_connection (self, + master_connection, + NULL, + NULL, + dbus_sender, + error); + if (!master_ac) + g_prefix_error (error, "%s", "Master device activation failed: "); + return master_ac; } g_set_error (error, @@ -2774,6 +2782,16 @@ nm_manager_activate_connection (NMManager *manager, return NULL; } + /* If this is an autoconnect request, but the device isn't allowing autoconnect + * right now, we reject it. + */ + if (!dbus_sender && !nm_device_autoconnect_allowed (device)) { + g_set_error (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_AUTOCONNECT_NOT_ALLOWED, + "%s does not allow automatic connections at this time", + nm_device_get_iface (device)); + return NULL; + } + /* Try to find the master connection/device if the connection has a dependency */ if (!find_master (manager, connection, device, &master_connection, &master_device)) { g_set_error_literal (error, NM_MANAGER_ERROR, NM_MANAGER_ERROR_UNKNOWN_DEVICE, diff --git a/src/nm-manager.h b/src/nm-manager.h index 66d0678318..710840385a 100644 --- a/src/nm-manager.h +++ b/src/nm-manager.h @@ -46,6 +46,7 @@ typedef enum { NM_MANAGER_ERROR_ALREADY_ENABLED_OR_DISABLED, /*< nick=AlreadyEnabledOrDisabled >*/ NM_MANAGER_ERROR_UNSUPPORTED_CONNECTION_TYPE, /*< nick=UnsupportedConnectionType >*/ NM_MANAGER_ERROR_DEPENDENCY_FAILED, /*< nick=DependencyFailed >*/ + NM_MANAGER_ERROR_AUTOCONNECT_NOT_ALLOWED, /*< nick=AutoconnectNotAllowed >*/ } NMManagerError; #define NM_MANAGER_VERSION "version"