[gnome-settings-daemon] Fix up get/set_property vfuncs for GDBus
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-settings-daemon] Fix up get/set_property vfuncs for GDBus
- Date: Tue, 27 Aug 2013 11:32:47 +0000 (UTC)
commit a8917aff40d7381449f434bd0a234c8930dfc452
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Aug 26 20:31:57 2013 -0400
Fix up get/set_property vfuncs for GDBus
GDBus asserts that a get_property implementation sets an error
if it returns NULL, and that a set_property implementation sets
and error if it returns FALSE. The power plugin was very far
from this requirement, and I have seen crashes of
gnome-settings-daemon due to this, when trying to set screen
brightness in a VM.
https://bugzilla.gnome.org/show_bug.cgi?id=706858
plugins/power/gsd-power-manager.c | 48 +++++++++++++++++++++++++++----------
1 files changed, 35 insertions(+), 13 deletions(-)
---
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index d162eba..724c80b 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -3693,7 +3693,8 @@ handle_method_call (GDBusConnection *connection,
static GVariant *
handle_get_property_main (GsdPowerManager *manager,
- const gchar *property_name)
+ const gchar *property_name,
+ GError **error)
{
GVariant *retval = NULL;
@@ -3707,20 +3708,27 @@ handle_get_property_main (GsdPowerManager *manager,
if (percentage >= 0)
retval = g_variant_new_double (percentage);
}
-
+ if (retval == NULL) {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+ "Failed to get property: %s", property_name);
+ }
return retval;
}
static GVariant *
handle_get_property_other (GsdPowerManager *manager,
const gchar *interface_name,
- const gchar *property_name)
+ const gchar *property_name,
+ GError **error)
{
GVariant *retval = NULL;
gint32 value;
- if (g_strcmp0 (property_name, "Brightness") != 0)
+ if (g_strcmp0 (property_name, "Brightness") != 0) {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+ "No such property: %s", property_name);
return NULL;
+ }
if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_SCREEN) == 0) {
value = backlight_get_percentage (manager->priv->rr_screen, NULL);
@@ -3730,6 +3738,10 @@ handle_get_property_other (GsdPowerManager *manager,
retval = g_variant_new_int32 (value);
}
+ if (retval == NULL) {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+ "Failed to get property: %s", property_name);
+ }
return retval;
}
@@ -3746,16 +3758,19 @@ handle_get_property (GDBusConnection *connection,
/* Check session pointer as a proxy for whether the manager is in the
start or stop state */
if (manager->priv->session == NULL) {
+ g_set_error_literal (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+ "No session");
return NULL;
}
if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE) == 0) {
- return handle_get_property_main (manager, property_name);
+ return handle_get_property_main (manager, property_name, error);
} else if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_SCREEN) == 0 ||
g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_KEYBOARD) == 0) {
- return handle_get_property_other (manager, interface_name, property_name);
+ return handle_get_property_other (manager, interface_name, property_name, error);
} else {
- g_warning ("not recognised interface: %s", interface_name);
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+ "No such interface: %s", interface_name);
return NULL;
}
}
@@ -3764,24 +3779,30 @@ static gboolean
handle_set_property_other (GsdPowerManager *manager,
const gchar *interface_name,
const gchar *property_name,
- GVariant *value)
+ GVariant *value,
+ GError **error)
{
gint32 brightness_value;
- if (g_strcmp0 (property_name, "Brightness") != 0)
+ if (g_strcmp0 (property_name, "Brightness") != 0) {
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+ "No such property: %s", property_name);
return FALSE;
+ }
if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_SCREEN) == 0) {
g_variant_get (value, "i", &brightness_value);
return backlight_set_percentage (manager->priv->rr_screen,
- brightness_value, NULL);
+ brightness_value, error);
} else if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_KEYBOARD) == 0) {
g_variant_get (value, "i", &brightness_value);
brightness_value = PERCENTAGE_TO_ABS (0, manager->priv->kbd_brightness_max,
brightness_value);
- return upower_kbd_set_brightness (manager, brightness_value, NULL);
+ return upower_kbd_set_brightness (manager, brightness_value, error);
}
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+ "No such interface: %s", interface_name);
return FALSE;
}
@@ -3804,9 +3825,10 @@ handle_set_property (GDBusConnection *connection,
if (g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_SCREEN) == 0 ||
g_strcmp0 (interface_name, GSD_POWER_DBUS_INTERFACE_KEYBOARD) == 0) {
- return handle_set_property_other (manager, interface_name, property_name, value);
+ return handle_set_property_other (manager, interface_name, property_name, value, error);
} else {
- g_warning ("not recognised interface: %s", interface_name);
+ g_set_error (error, G_DBUS_ERROR, G_DBUS_ERROR_FAILED,
+ "No such interface: %s", interface_name);
return FALSE;
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]