summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Koegel <eric.koegel@gmail.com>2014-12-08 15:33:07 +0300
committerEric Koegel <eric.koegel@gmail.com>2014-12-10 19:39:48 +0300
commit2fb1b8f8313d6246dc7f79b35bd5a2fab6c41282 (patch)
treec1fad4ff0347fbd20e6d026a81b23055bda8c337
parent2cd4ba484bfec3354a2bbc58f94e93f874757f1e (diff)
downloadxfce4-session-2fb1b8f8313d6246dc7f79b35bd5a2fab6c41282.tar.gz
Gracefully handle the sessions dir being readonly (Bug #11307)
If the user has their ~/.cache/sessions directory set as read-only xfsm would crash on logout. This patch has xfsm check before it writes to that folder location.
-rw-r--r--xfce4-session/xfsm-logout-dialog.c8
-rw-r--r--xfce4-session/xfsm-manager.c33
2 files changed, 40 insertions, 1 deletions
diff --git a/xfce4-session/xfsm-logout-dialog.c b/xfce4-session/xfsm-logout-dialog.c
index 53745518..c86a1556 100644
--- a/xfce4-session/xfsm-logout-dialog.c
+++ b/xfce4-session/xfsm-logout-dialog.c
@@ -588,6 +588,14 @@ xfsm_logout_dialog_screenshot_save (GdkPixbuf *screenshot,
g_free (display_name);
g_free (path);
+ if (!filename)
+ {
+ g_warning ("Unable to save screenshot, "
+ "error calling xfce_resource_save_location with %s, "
+ "check your permissions", path);
+ return;
+ }
+
if (!gdk_pixbuf_save (scaled, filename, "png", &error, NULL))
{
g_warning ("Failed to save session screenshot: %s", error->message);
diff --git a/xfce4-session/xfsm-manager.c b/xfce4-session/xfsm-manager.c
index dc2960e7..8b62607f 100644
--- a/xfce4-session/xfsm-manager.c
+++ b/xfce4-session/xfsm-manager.c
@@ -741,7 +741,7 @@ xfsm_manager_load_settings (XfsmManager *manager,
}
/* FIXME: migrate this into the splash screen somehow so the
- * window doesn't look ugly (right now now WM is running, so it
+ * window doesn't look ugly (right now no WM is running, so it
* won't have window decorations). */
xfce_message_dialog (NULL, _("Session Manager Error"),
GTK_STOCK_DIALOG_ERROR,
@@ -1652,6 +1652,8 @@ xfsm_manager_store_session (XfsmManager *manager)
GdkDisplay *display;
WnckScreen *screen;
XfceRc *rc;
+ GFile *session_file;
+ GFileInfo *info;
GList *lp;
gchar prefix[64];
gchar *backup;
@@ -1659,6 +1661,7 @@ xfsm_manager_store_session (XfsmManager *manager)
gint count = 0;
gint n, m;
+ /* open file for writing, creates it if it doesn't exist */
rc = xfce_rc_simple_open (manager->session_file, FALSE);
if (G_UNLIKELY (rc == NULL))
{
@@ -1670,6 +1673,32 @@ xfsm_manager_store_session (XfsmManager *manager)
return;
}
+ session_file = g_file_new_for_path (manager->session_file);
+
+ /* query the file, we need to make sure we can write to it */
+ info = g_file_query_info (session_file,
+ G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE,
+ G_FILE_QUERY_INFO_NONE,
+ NULL,
+ NULL);
+
+ /* if we're unable to query the file attributes or write to the file,
+ * log the failure and return */
+ if (!info || !g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
+ {
+ fprintf (stderr,
+ "xfce4-session: Unable to save changes to the session file %s"
+ "Please check your installation.\n", manager->session_file);
+
+ if (info)
+ g_object_unref (info);
+
+ xfce_rc_close (rc);
+ g_object_unref (session_file);
+
+ return;
+ }
+
/* backup the old session file first */
if (g_file_test (manager->session_file, G_FILE_TEST_IS_REGULAR))
{
@@ -1743,6 +1772,8 @@ xfsm_manager_store_session (XfsmManager *manager)
xfce_rc_close (rc);
+ g_object_unref (session_file);
+
g_free (manager->checkpoint_session_name);
manager->checkpoint_session_name = NULL;
}