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