From 8b8c6bb818b21b9c7fcf7481df7154745b4aad41 Mon Sep 17 00:00:00 2001 From: Benno Schulenberg <bensberg@telfort.nl> Date: Tue, 20 Mar 2018 19:56:03 +0100 Subject: [PATCH] tweaks: factor out the check for 'viewok' into its own function And also prevent a theoretical crash for restricted prompt functions. --- src/nano.c | 24 +++++++++++++----------- src/prompt.c | 2 +- src/proto.h | 1 + 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/nano.c b/src/nano.c index 678dc987..53adf1b3 100644 --- a/src/nano.c +++ b/src/nano.c @@ -1636,6 +1636,14 @@ bool wanted_to_move(void (*func)(void)) func == to_first_line || func == to_last_line; } +/* Return TRUE when the given shortcut is valid in view mode. */ +bool okay_for_view(const sc *shortcut) +{ + const subnfunc *func = sctofunc(shortcut); + + return (func && func->viewok); +} + /* Read in a keystroke. Act on the keystroke if it is a shortcut or a toggle; * otherwise, insert it into the edit buffer. If allow_funcs is FALSE, don't * do anything with the keystroke -- just return it. */ @@ -1727,12 +1735,9 @@ int do_input(bool allow_funcs) if (shortcut == NULL) pletion_line = NULL; else { - if (ISSET(VIEW_MODE)) { - const subnfunc *f = sctofunc(shortcut); - if (f && !f->viewok) { - print_view_warning(); - return ERR; - } + if (ISSET(VIEW_MODE) && !okay_for_view(shortcut)) { + print_view_warning(); + return ERR; } /* If the function associated with this shortcut is @@ -1804,11 +1809,8 @@ int do_input(bool allow_funcs) wrap_reset(); #endif #ifdef ENABLE_COLOR - if (!refresh_needed) { - const subnfunc *f = sctofunc(shortcut); - if (f && !f->viewok) - check_the_multis(openfile->current); - } + if (!refresh_needed && !okay_for_view(shortcut)) + check_the_multis(openfile->current); #endif if (!refresh_needed && (shortcut->func == do_delete || shortcut->func == do_backspace)) diff --git a/src/prompt.c b/src/prompt.c index 2c612c6e..f4585eb2 100644 --- a/src/prompt.c +++ b/src/prompt.c @@ -171,7 +171,7 @@ int do_statusbar_input(bool *finished) /* Handle any other shortcut in the current menu, setting finished * to TRUE to indicate that we're done after running or trying to * run its associated function. */ - if (!ISSET(VIEW_MODE) || sctofunc(shortcut)->viewok) + if (!ISSET(VIEW_MODE) || okay_for_view(shortcut)) shortcut->func(); *finished = TRUE; } diff --git a/src/proto.h b/src/proto.h index 9b151798..d131f995 100644 --- a/src/proto.h +++ b/src/proto.h @@ -439,6 +439,7 @@ void disable_flow_control(void); void enable_flow_control(void); void terminal_init(void); void unbound_key(int code); +bool okay_for_view(const sc *shortcut); int do_input(bool allow_funcs); void do_output(char *output, size_t output_len, bool allow_cntrls); -- GitLab