From d48071b2b28bfb1a84a1642659ff1afadba19470 Mon Sep 17 00:00:00 2001
From: David Lawrence Ramsey <pooka109@gmail.com>
Date: Sat, 26 Nov 2016 13:33:31 -0600
Subject: [PATCH] input: properly check the full escape sequences for all keys

Also for Delete, End, PageUp and PageDown (on some terminals)
the last byte in the sequence needs to be checked.

This fixes https://savannah.gnu.org/bugs/?49710.
---
 src/winio.c | 16 ++++++++++++----
 1 file changed, 12 insertions(+), 4 deletions(-)

diff --git a/src/winio.c b/src/winio.c
index f8854a1a..38dfb1ce 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -1015,18 +1015,26 @@ int convert_sequence(const int *seq, size_t seq_len)
 			break;
 		    case '3': /* Esc [ 3 ~ == Delete on VT220/VT320/
 			       * Linux console/xterm/Terminal. */
-			return KEY_DC;
+			if (seq_len > 2 && seq[2] == '~')
+			    return KEY_DC;
+			break;
 		    case '4': /* Esc [ 4 ~ == End on VT220/VT320/Linux
 			       * console/xterm. */
-			return KEY_END;
+			if (seq_len > 2 && seq[2] == '~')
+			    return KEY_END;
+			break;
 		    case '5': /* Esc [ 5 ~ == PageUp on VT220/VT320/
 			       * Linux console/xterm/Terminal;
 			       * Esc [ 5 ^ == PageUp on Eterm. */
-			return KEY_PPAGE;
+			if (seq_len > 2 && (seq[2] == '~' || seq[2] == '^'))
+			    return KEY_PPAGE;
+			break;
 		    case '6': /* Esc [ 6 ~ == PageDown on VT220/VT320/
 			       * Linux console/xterm/Terminal;
 			       * Esc [ 6 ^ == PageDown on Eterm. */
-			return KEY_NPAGE;
+			if (seq_len > 2 && (seq[2] == '~' || seq[2] == '^'))
+			    return KEY_NPAGE;
+			break;
 		    case '7': /* Esc [ 7 ~ == Home on Eterm/rxvt,
 			       * Esc [ 7 $ == Shift-Home on Eterm/rxvt. */
 			if (seq_len > 2 && seq[2] == '~')
-- 
GitLab