[gnome-settings-daemon] power: Don't crash when setting the dim timeout when using NX



commit 6a401f789396428f9a91bdad44160494b764ea28
Author: Richard Hughes <richard hughsie com>
Date:   Fri Oct 7 10:35:08 2011 +0100

    power: Don't crash when setting the dim timeout when using NX
    
    We're querying a timer that doesn't exist, plus we're not even catching the X
    error. Fix both.
    
    Resolves https://bugzilla.gnome.org/show_bug.cgi?id=661000

 plugins/power/gpm-idletime.c      |   10 ++++++++++
 plugins/power/gsd-power-manager.c |    2 ++
 2 files changed, 12 insertions(+), 0 deletions(-)
---
diff --git a/plugins/power/gpm-idletime.c b/plugins/power/gpm-idletime.c
index fc28fc3..aefe80c 100644
--- a/plugins/power/gpm-idletime.c
+++ b/plugins/power/gpm-idletime.c
@@ -80,13 +80,23 @@ gpm_idletime_xsyncvalue_to_int64 (XSyncValue value)
                 (guint64) XSyncValueLow32 (value);
 }
 
+/* gets the IDLETIME counter value, or 0 for invalid */
 gint64
 gpm_idletime_get_time (GpmIdletime *idletime)
 {
         XSyncValue value;
+
+        /* we don't have IDLETIME support */
+        if (!idletime->priv->idle_counter)
+                return 0;
+
+        /* NX explodes if you query the counter */
+        gdk_error_trap_push ();
         XSyncQueryCounter (idletime->priv->dpy,
                            idletime->priv->idle_counter,
                            &value);
+        if (gdk_error_trap_pop ())
+                return 0;
         return gpm_idletime_xsyncvalue_to_int64 (value);
 }
 
diff --git a/plugins/power/gsd-power-manager.c b/plugins/power/gsd-power-manager.c
index e34ba3c..4072c02 100644
--- a/plugins/power/gsd-power-manager.c
+++ b/plugins/power/gsd-power-manager.c
@@ -2970,6 +2970,8 @@ idle_set_timeout_dim (GsdPowerManager *manager, guint timeout)
         guint timeout_adjusted;
 
         idle_time_in_msec = gpm_idletime_get_time (manager->priv->idletime);
+        if (idle_time_in_msec == 0)
+                return FALSE;
         timeout_adjusted  = idle_adjust_timeout_dim (idle_time_in_msec / 1000, timeout);
         g_debug ("Current idle time=%lldms, timeout was %us, becomes %us after adjustment",
                    (long long int)idle_time_in_msec, timeout, timeout_adjusted);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]