summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Haller <thaller@redhat.com>2022-06-09 17:49:11 +0200
committerThomas Haller <thaller@redhat.com>2022-06-27 14:04:40 +0200
commit7f766014c51e4a72c8505fefe2e9d9b3d424f7a5 (patch)
tree362456d2a5536e558bcc24f0644eb2ee02c4c98d
parente3c06798597b9dc1dd8f262dc60910165234b5a3 (diff)
downloadNetworkManager-7f766014c51e4a72c8505fefe2e9d9b3d424f7a5.tar.gz
team: specify cli-type for teamdctl_connect() to select usock/dbus
teamdctl_connect() has a parameter cli_type. If unspecified, the library will try usock, dbus (if enabled) and zmq (if enabled). Trying to use the unix socket if we expect to use D-Bus can be bad. For example, it might cause SELinux denials. As we anyway require libteam to use D-Bus, if D-Bus is available, explicitly select the cli type. https://gitlab.freedesktop.org/NetworkManager/NetworkManager/-/merge_requests/1255
-rw-r--r--src/core/devices/team/nm-device-team.c100
1 files changed, 64 insertions, 36 deletions
diff --git a/src/core/devices/team/nm-device-team.c b/src/core/devices/team/nm-device-team.c
index 1f098806d3..e6d34266b1 100644
--- a/src/core/devices/team/nm-device-team.c
+++ b/src/core/devices/team/nm-device-team.c
@@ -65,6 +65,50 @@ static gboolean teamd_start(NMDeviceTeam *self);
/*****************************************************************************/
+static struct teamdctl *
+_tdc_connect_new(NMDeviceTeam *self, const char *iface, GError **error)
+{
+ NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE(self);
+ struct teamdctl *tdc;
+ const char *cli_type;
+ int r;
+
+ tdc = teamdctl_alloc();
+ if (!tdc) {
+ nm_utils_error_set(error, NM_UTILS_ERROR_UNKNOWN, "failure to allocate teamdctl structure");
+ g_return_val_if_reached(NULL);
+ }
+
+ if (priv->teamd_dbus_watch)
+ cli_type = "dbus";
+ else if (priv->usock_monitor)
+ cli_type = "usock";
+ else
+ cli_type = NULL;
+
+again:
+ r = teamdctl_connect(tdc, iface, NULL, cli_type);
+ if (r != 0) {
+ _LOGD(LOGD_TEAM,
+ "failure to connect to teamdctl%s%s, err=%d",
+ NM_PRINT_FMT_QUOTED2(cli_type, " with cli_type=", cli_type, ""),
+ r);
+ if (cli_type) {
+ /* How odd. Let's retry with any CLI type. */
+ cli_type = NULL;
+ goto again;
+ }
+ teamdctl_free(tdc);
+ nm_utils_error_set(error,
+ NM_UTILS_ERROR_UNKNOWN,
+ "failure to connect to teamd (err=%d)",
+ r);
+ return NULL;
+ }
+
+ return tdc;
+}
+
static NMDeviceCapabilities
get_generic_capabilities(NMDevice *device)
{
@@ -96,21 +140,16 @@ complete_connection(NMDevice *device,
static gboolean
ensure_teamd_connection(NMDevice *device)
{
- NMDeviceTeam *self = NM_DEVICE_TEAM(device);
- NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE(self);
- int err;
+ NMDeviceTeam *self = NM_DEVICE_TEAM(device);
+ NMDeviceTeamPrivate *priv = NM_DEVICE_TEAM_GET_PRIVATE(self);
+ gs_free_error GError *error = NULL;
if (priv->tdc)
return TRUE;
- priv->tdc = teamdctl_alloc();
- g_assert(priv->tdc);
- err = teamdctl_connect(priv->tdc, nm_device_get_iface(device), NULL, NULL);
- if (err != 0) {
- _LOGE(LOGD_TEAM, "failed to connect to teamd (err=%d)", err);
- teamdctl_free(priv->tdc);
- priv->tdc = NULL;
- }
+ priv->tdc = _tdc_connect_new(self, nm_device_get_iface(device), &error);
+ if (!priv->tdc)
+ _LOGE(LOGD_TEAM, "failed to connect to teamd: %s", error->message);
return !!priv->tdc;
}
@@ -183,42 +222,31 @@ update_connection(NMDevice *device, NMConnection *connection)
/*****************************************************************************/
static gboolean
-master_update_slave_connection(NMDevice *self,
+master_update_slave_connection(NMDevice *device,
NMDevice *slave,
NMConnection *connection,
GError **error)
{
- NMSettingTeamPort *s_port;
- char *port_config = NULL;
- int err = 0;
- struct teamdctl *tdc;
- const char *team_port_config = NULL;
- const char *iface = nm_device_get_iface(self);
- const char *iface_slave = nm_device_get_iface(slave);
-
- tdc = teamdctl_alloc();
+ NMDeviceTeam *self = NM_DEVICE_TEAM(device);
+ NMSettingTeamPort *s_port;
+ char *port_config = NULL;
+ gs_free_error GError *connect_error = NULL;
+ int err = 0;
+ struct teamdctl *tdc;
+ const char *team_port_config = NULL;
+ const char *iface = nm_device_get_iface(device);
+ const char *iface_slave = nm_device_get_iface(slave);
+
+ tdc = _tdc_connect_new(self, iface, &connect_error);
if (!tdc) {
g_set_error(error,
NM_DEVICE_ERROR,
NM_DEVICE_ERROR_FAILED,
"update slave connection for slave '%s' failed to connect to teamd for master "
- "%s (out of memory?)",
- iface_slave,
- iface);
- g_return_val_if_reached(FALSE);
- }
-
- err = teamdctl_connect(tdc, iface, NULL, NULL);
- if (err) {
- teamdctl_free(tdc);
- g_set_error(error,
- NM_DEVICE_ERROR,
- NM_DEVICE_ERROR_FAILED,
- "update slave connection for slave '%s' failed to connect to teamd for master "
- "%s (err=%d)",
+ "%s (%s)",
iface_slave,
iface,
- err);
+ connect_error->message);
return FALSE;
}