From ed6cb59b5d6122295c640c95b6103a9a4fa02589 Mon Sep 17 00:00:00 2001 From: Dave Davenport Date: Wed, 2 Nov 2016 18:20:17 +0100 Subject: [PATCH] Fix crash on wrongly queued ViewState (thx to teto) --- include/widgets/textbox.h | 20 ++++++++++---------- source/dialogs/ssh.c | 2 +- source/helper.c | 4 ++-- source/rofi.c | 6 +++++- source/view.c | 2 +- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/include/widgets/textbox.h b/include/widgets/textbox.h index 0a051ff4..2425eca8 100644 --- a/include/widgets/textbox.h +++ b/include/widgets/textbox.h @@ -46,16 +46,16 @@ typedef struct */ typedef enum { - TB_AUTOHEIGHT = 1 << 0, - TB_AUTOWIDTH = 1 << 1, - TB_LEFT = 1 << 16, - TB_RIGHT = 1 << 17, - TB_CENTER = 1 << 18, - TB_EDITABLE = 1 << 19, - TB_MARKUP = 1 << 20, - TB_WRAP = 1 << 21, - TB_PASSWORD = 1 << 22, - TB_INDICATOR = 1 << 23, + TB_AUTOHEIGHT = 1 << 0, + TB_AUTOWIDTH = 1 << 1, + TB_LEFT = 1 << 16, + TB_RIGHT = 1 << 17, + TB_CENTER = 1 << 18, + TB_EDITABLE = 1 << 19, + TB_MARKUP = 1 << 20, + TB_WRAP = 1 << 21, + TB_PASSWORD = 1 << 22, + TB_INDICATOR = 1 << 23, } TextboxFlags; /** * Flags indicating current state of the textbox. diff --git a/source/dialogs/ssh.c b/source/dialogs/ssh.c index 5ad6078f..1b3e0a78 100644 --- a/source/dialogs/ssh.c +++ b/source/dialogs/ssh.c @@ -198,7 +198,7 @@ static char **read_hosts_file ( char ** retv, unsigned int *length ) // Reading one line per time. while ( getline ( &buffer, &buffer_length, fd ) > 0 ) { // Evaluate one line. - unsigned int index = 0, ti = 0; + unsigned int index = 0, ti = 0; char *token = buffer; // Tokenize it. diff --git a/source/helper.c b/source/helper.c index 9270e1ed..bf21e0a6 100644 --- a/source/helper.c +++ b/source/helper.c @@ -194,7 +194,7 @@ static GRegex * create_regex ( const char *input, int case_sensitive ) { #define R( s ) g_regex_new ( s, G_REGEX_OPTIMIZE | ( ( case_sensitive ) ? 0 : G_REGEX_CASELESS ), 0, NULL ) GRegex * retv = NULL; - gchar *r; + gchar *r; switch ( config.matching_method ) { case MM_GLOB: @@ -234,7 +234,7 @@ GRegex **tokenize ( const char *input, int case_sensitive ) } char *saveptr = NULL, *token; - GRegex **retv = NULL; + GRegex **retv = NULL; if ( !config.tokenize ) { retv = g_malloc0 ( sizeof ( GRegex* ) * 2 ); retv[0] = (GRegex *) create_regex ( input, case_sensitive ); diff --git a/source/rofi.c b/source/rofi.c index 11209106..46e00bd5 100644 --- a/source/rofi.c +++ b/source/rofi.c @@ -174,6 +174,10 @@ static void run_switcher ( ModeMode mode ) return; } } + // Error dialog must have been created. + if ( rofi_view_get_active () != NULL ) { + return; + } curr_switcher = mode; RofiViewState * state = rofi_view_create ( modi[mode], config.filter, NULL, MENU_NORMAL, process_result ); if ( state ) { @@ -352,7 +356,7 @@ static int add_mode ( const char * token ) } else #endif // WINDOW_MODE - // SSh dialog + // SSh dialog if ( strcasecmp ( token, "ssh" ) == 0 ) { modi[num_modi] = &ssh_mode; num_modi++; diff --git a/source/view.c b/source/view.c index e38b7892..d58c7062 100644 --- a/source/view.c +++ b/source/view.c @@ -284,7 +284,7 @@ RofiViewState * rofi_view_get_active ( void ) void rofi_view_set_active ( RofiViewState *state ) { if ( current_active_menu != NULL && state != NULL ) { - g_queue_push_head ( &( CacheState.views ), state ); + g_queue_push_head ( &( CacheState.views ), current_active_menu ); // TODO check. current_active_menu = state; g_log ( LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "stack view." );