diff options
author | Eric Koegel <eric.koegel@gmail.com> | 2014-12-08 15:33:07 +0300 |
---|---|---|
committer | Eric Koegel <eric.koegel@gmail.com> | 2014-12-10 19:39:48 +0300 |
commit | 2fb1b8f8313d6246dc7f79b35bd5a2fab6c41282 (patch) | |
tree | c1fad4ff0347fbd20e6d026a81b23055bda8c337 | |
parent | 2cd4ba484bfec3354a2bbc58f94e93f874757f1e (diff) | |
download | xfce4-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.c | 8 | ||||
-rw-r--r-- | xfce4-session/xfsm-manager.c | 33 |
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; } |