From 4cdad8299f605e8b0527391a49311786e0bca35c Mon Sep 17 00:00:00 2001 From: Kamil Dudka Date: Tue, 20 Mar 2018 16:49:34 +0100 Subject: [PATCH 1/2] input: do not crash if sctofunc() returns NULL This fixes a regression introduced by commit 54103d8e: a crash that can be triggered by running 'nano --restrict' and pressing . This addresses https://bugzilla.redhat.com/1558532. Upstream-commit: b830a7dd384495fb9b882f866b26948025abe136 Signed-off-by: Kamil Dudka --- src/nano.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/src/nano.c b/src/nano.c index ad95925..e7b6d62 100644 --- a/src/nano.c +++ b/src/nano.c @@ -1712,9 +1712,12 @@ int do_input(bool allow_funcs) if (shortcut == NULL) pletion_line = NULL; else { - if (ISSET(VIEW_MODE) && !sctofunc(shortcut)->viewok) { - print_view_warning(); - return ERR; + if (ISSET(VIEW_MODE)) { + const subnfunc *f = sctofunc(shortcut); + if (f && !f->viewok) { + print_view_warning(); + return ERR; + } } /* If the function associated with this shortcut is @@ -1787,8 +1790,11 @@ int do_input(bool allow_funcs) wrap_reset(); #endif #ifdef ENABLE_COLOR - if (!refresh_needed && !sctofunc(shortcut)->viewok) - check_the_multis(openfile->current); + if (!refresh_needed) { + const subnfunc *f = sctofunc(shortcut); + if (f && !f->viewok) + check_the_multis(openfile->current); + } #endif if (!refresh_needed && (shortcut->func == do_delete || shortcut->func == do_backspace)) -- 2.14.3 From 25a02d16fc59bbe88cdc51922534436b20187a3d Mon Sep 17 00:00:00 2001 From: Benno Schulenberg Date: Tue, 20 Mar 2018 19:56:03 +0100 Subject: [PATCH 2/2] tweaks: factor out the check for 'viewok' into its own function And also prevent a theoretical crash for restricted prompt functions. Upstream-commit: 8b8c6bb818b21b9c7fcf7481df7154745b4aad41 Signed-off-by: Kamil Dudka --- 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 e7b6d62..c39622b 100644 --- a/src/nano.c +++ b/src/nano.c @@ -1621,6 +1621,14 @@ int do_mouse(void) } #endif /* ENABLE_MOUSE */ +/* 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. */ @@ -1712,12 +1720,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 @@ -1790,11 +1795,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 e8fbbc0..8ec74fd 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 86f53d7..5530a90 100644 --- a/src/proto.h +++ b/src/proto.h @@ -441,6 +441,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); -- 2.14.3