Dan Winship bd53380
From 8a046bedbbf8218737d7471f949a541b35579539 Mon Sep 17 00:00:00 2001
Dan Winship bd53380
From: Thomas Haller <thaller@redhat.com>
Dan Winship bd53380
Date: Fri, 11 Oct 2013 18:25:20 +0200
Dan Winship bd53380
Subject: [PATCH] core: fix crash for bridge-slave with missing
Dan Winship bd53380
 NMSettingBridgePort setting
Dan Winship bd53380
Dan Winship bd53380
Signed-off-by: Thomas Haller <thaller@redhat.com>
Dan Winship bd53380
---
Dan Winship bd53380
 src/devices/nm-device-bridge.c | 29 ++++++++++++++++++-----------
Dan Winship bd53380
 1 file changed, 18 insertions(+), 11 deletions(-)
Dan Winship bd53380
Dan Winship bd53380
diff --git a/src/devices/nm-device-bridge.c b/src/devices/nm-device-bridge.c
Dan Winship bd53380
index 69e976c..2018e93 100644
Dan Winship bd53380
--- a/src/devices/nm-device-bridge.c
Dan Winship bd53380
+++ b/src/devices/nm-device-bridge.c
Dan Winship bd53380
@@ -203,7 +203,7 @@ static const Option slave_options[] = {
Dan Winship bd53380
 };
Dan Winship bd53380
 
Dan Winship bd53380
 static void
Dan Winship bd53380
-commit_option (NMDevice *device, GObject *setting, const Option *option, gboolean slave)
Dan Winship bd53380
+commit_option (NMDevice *device, NMSetting *setting, const Option *option, gboolean slave)
Dan Winship bd53380
 {
Dan Winship bd53380
 	int ifindex = nm_device_get_ifindex (device);
Dan Winship bd53380
 	GParamSpec *pspec;
Dan Winship bd53380
@@ -211,12 +211,14 @@ commit_option (NMDevice *device, GObject *setting, const Option *option, gboolea
Dan Winship bd53380
 	guint32 uval = 0;
Dan Winship bd53380
 	gs_free char *value = NULL;
Dan Winship bd53380
 
Dan Winship bd53380
+	g_assert (setting);
Dan Winship bd53380
+
Dan Winship bd53380
 	pspec = g_object_class_find_property (G_OBJECT_GET_CLASS (setting), option->name);
Dan Winship bd53380
 	g_assert (pspec);
Dan Winship bd53380
 
Dan Winship bd53380
 	/* Get the property's value */
Dan Winship bd53380
 	g_value_init (&val, G_PARAM_SPEC_VALUE_TYPE (pspec));
Dan Winship bd53380
-	g_object_get_property (setting, option->name, &val;;
Dan Winship bd53380
+	g_object_get_property ((GObject *) setting, option->name, &val;;
Dan Winship bd53380
 	if (G_VALUE_HOLDS_BOOLEAN (&val))
Dan Winship bd53380
 		uval = g_value_get_boolean (&val) ? 1 : 0;
Dan Winship bd53380
 	else if (G_VALUE_HOLDS_UINT (&val)) {
Dan Winship bd53380
@@ -251,25 +253,30 @@ commit_option (NMDevice *device, GObject *setting, const Option *option, gboolea
Dan Winship bd53380
 }
Dan Winship bd53380
 
Dan Winship bd53380
 static void
Dan Winship bd53380
-commit_master_options (NMDevice *device, GObject *setting)
Dan Winship bd53380
+commit_master_options (NMDevice *device, NMSettingBridge *setting)
Dan Winship bd53380
 {
Dan Winship bd53380
 	const Option *option;
Dan Winship bd53380
-
Dan Winship bd53380
-	g_assert (setting);
Dan Winship bd53380
+	NMSetting *s = NM_SETTING (setting);
Dan Winship bd53380
 
Dan Winship bd53380
 	for (option = master_options; option->name; option++)
Dan Winship bd53380
-		commit_option (device, setting, option, FALSE);
Dan Winship bd53380
+		commit_option (device, s, option, FALSE);
Dan Winship bd53380
 }
Dan Winship bd53380
 
Dan Winship bd53380
 static void
Dan Winship bd53380
-commit_slave_options (NMDevice *device, GObject *setting)
Dan Winship bd53380
+commit_slave_options (NMDevice *device, NMSettingBridgePort *setting)
Dan Winship bd53380
 {
Dan Winship bd53380
 	const Option *option;
Dan Winship bd53380
+	NMSetting *s, *s_clear = NULL;
Dan Winship bd53380
 
Dan Winship bd53380
-	g_assert (setting);
Dan Winship bd53380
+	if (setting)
Dan Winship bd53380
+		s = NM_SETTING (setting);
Dan Winship bd53380
+	else
Dan Winship bd53380
+		s = s_clear = nm_setting_bridge_port_new ();
Dan Winship bd53380
 
Dan Winship bd53380
 	for (option = slave_options; option->name; option++)
Dan Winship bd53380
-		commit_option (device, setting, option, TRUE);
Dan Winship bd53380
+		commit_option (device, s, option, TRUE);
Dan Winship bd53380
+
Dan Winship bd53380
+	g_clear_object (&s_clear);
Dan Winship bd53380
 }
Dan Winship bd53380
 
Dan Winship bd53380
 static NMActStageReturn
Dan Winship bd53380
@@ -284,7 +291,7 @@ act_stage1_prepare (NMDevice *device, NMDeviceStateReason *reason)
Dan Winship bd53380
 	if (ret != NM_ACT_STAGE_RETURN_SUCCESS)
Dan Winship bd53380
 		return ret;
Dan Winship bd53380
 
Dan Winship bd53380
-	commit_master_options (device, (GObject *) nm_connection_get_setting_bridge (connection));
Dan Winship bd53380
+	commit_master_options (device, nm_connection_get_setting_bridge (connection));
Dan Winship bd53380
 
Dan Winship bd53380
 	return NM_ACT_STAGE_RETURN_SUCCESS;
Dan Winship bd53380
 }
Dan Winship bd53380
@@ -295,7 +302,7 @@ enslave_slave (NMDevice *device, NMDevice *slave, NMConnection *connection)
Dan Winship bd53380
 	if (!nm_platform_link_enslave (nm_device_get_ip_ifindex (device), nm_device_get_ip_ifindex (slave)))
Dan Winship bd53380
 		return FALSE;
Dan Winship bd53380
 
Dan Winship bd53380
-	commit_slave_options (slave, (GObject *) nm_connection_get_setting_bridge_port (connection));
Dan Winship bd53380
+	commit_slave_options (slave, nm_connection_get_setting_bridge_port (connection));
Dan Winship bd53380
 
Dan Winship bd53380
 	nm_log_info (LOGD_BRIDGE, "(%s): attached bridge port %s",
Dan Winship bd53380
 	             nm_device_get_ip_iface (device),
Dan Winship bd53380
-- 
Dan Winship bd53380
1.8.4.2
Dan Winship bd53380