From a7a46bbe1cac8d3512679637cd75e53e9e98c121 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Fri, 18 May 2012 23:57:04 +0200 Subject: [PATCH] main: Make sure that --mode parameter is valid Instead of falling back to a set of default values or crashing the window manager when an invalid mode is specified, check the value of the ShellGlobal:session-mode property before taking over as WM and make a clean exit if it cannot be resolved to an existent mode. https://bugzilla.gnome.org/show_bug.cgi?id=676156 --- js/ui/sessionMode.js | 5 +++++ src/main.c | 6 ++++++ src/shell-global-private.h | 1 + src/shell-global.c | 15 +++++++++++++++ 4 files changed, 27 insertions(+) diff --git a/js/ui/sessionMode.js b/js/ui/sessionMode.js index 0cc2c14f9..1ed5aaa21 100644 --- a/js/ui/sessionMode.js +++ b/js/ui/sessionMode.js @@ -13,6 +13,11 @@ const _modes = { 'user': { sessionType: Shell.SessionType.USER } }; +function modeExists(mode) { + let modes = Object.getOwnPropertyNames(_modes); + return modes.indexOf(mode) != -1; +} + const SessionMode = new Lang.Class({ Name: 'SessionMode', diff --git a/src/main.c b/src/main.c index bd3b128b0..97ad90af2 100644 --- a/src/main.c +++ b/src/main.c @@ -335,6 +335,12 @@ main (int argc, char **argv) _shell_global_init ("session-mode", session_mode, NULL); + if (!_shell_global_has_valid_session_mode (shell_global_get ())) + { + g_printerr ("\"%s\" is not a valid mode.\n", session_mode); + exit(1); + } + ecode = meta_run (); if (g_getenv ("GNOME_SHELL_ENABLE_CLEANUP")) diff --git a/src/shell-global-private.h b/src/shell-global-private.h index 62f7c2603..45e204ff3 100644 --- a/src/shell-global-private.h +++ b/src/shell-global-private.h @@ -13,6 +13,7 @@ void _shell_global_set_plugin (ShellGlobal *global, GjsContext *_shell_global_get_gjs_context (ShellGlobal *global); +gboolean _shell_global_has_valid_session_mode (ShellGlobal *global); gboolean _shell_global_check_xdnd_event (ShellGlobal *global, XEvent *xev); diff --git a/src/shell-global.c b/src/shell-global.c index 01950190c..bc5a5c16d 100644 --- a/src/shell-global.c +++ b/src/shell-global.c @@ -597,6 +597,21 @@ shell_global_set_stage_input_mode (ShellGlobal *global, } } +gboolean +_shell_global_has_valid_session_mode (ShellGlobal *global) +{ + char *script; + int status; + + script = g_strdup_printf ("imports.ui.environment.init();" + "imports.ui.sessionMode.modeExists('%s') || 1;", + global->session_mode); + gjs_context_eval (global->js_context, script, -1, "", &status, NULL); + g_free (script); + + return status == 0; +} + /** * shell_global_set_cursor: * @global: A #ShellGlobal