From 21f7db4c4dbbc1837667a7d813663036f9288ea6 Mon Sep 17 00:00:00 2001
From: nicm <nicm>
Date: Wed, 26 Feb 2025 08:55:27 +0000
Subject: [PATCH] Do not allow meta prefix on paste start and end sequences,
 GitHub issue 4387.

---
 server-client.c | 4 ++--
 tmux.h          | 3 ++-
 tty-keys.c      | 4 ++--
 3 files changed, 6 insertions(+), 5 deletions(-)

diff --git a/server-client.c b/server-client.c
index 847a8576..7b017697 100644
--- a/server-client.c
+++ b/server-client.c
@@ -2247,13 +2247,13 @@ out:
 static int
 server_client_is_bracket_paste(struct client *c, key_code key)
 {
-	if (key == KEYC_PASTE_START) {
+	if ((key & KEYC_MASK_KEY) == KEYC_PASTE_START) {
 		c->flags |= CLIENT_BRACKETPASTING;
 		log_debug("%s: bracket paste on", c->name);
 		return (0);
 	}
 
-	if (key == KEYC_PASTE_END) {
+	if ((key & KEYC_MASK_KEY) == KEYC_PASTE_END) {
 		c->flags &= ~CLIENT_BRACKETPASTING;
 		log_debug("%s: bracket paste off", c->name);
 		return (0);
diff --git a/tmux.h b/tmux.h
index cd93097e..52b85cb1 100644
--- a/tmux.h
+++ b/tmux.h
@@ -167,7 +167,8 @@ struct winlink;
 
 /* Is this a paste key? */
 #define KEYC_IS_PASTE(key) \
-	((key) == KEYC_PASTE_START || (key) == KEYC_PASTE_END)
+	(((key) & KEYC_MASK_KEY) == KEYC_PASTE_START || \
+	 ((key) & KEYC_MASK_KEY) == KEYC_PASTE_END)
 
 /* Multiple click timeout. */
 #define KEYC_CLICK_TIMEOUT 300
diff --git a/tty-keys.c b/tty-keys.c
index 0de31c5d..77ab4ae1 100644
--- a/tty-keys.c
+++ b/tty-keys.c
@@ -208,8 +208,8 @@ static const struct tty_default_key_raw tty_default_raw_keys[] = {
 	{ "\033[O", KEYC_FOCUS_OUT },
 
 	/* Paste keys. */
-	{ "\033[200~", KEYC_PASTE_START },
-	{ "\033[201~", KEYC_PASTE_END },
+	{ "\033[200~", KEYC_PASTE_START|KEYC_IMPLIED_META },
+	{ "\033[201~", KEYC_PASTE_END|KEYC_IMPLIED_META },
 
 	/* Extended keys. */
 	{ "\033[1;5Z", '\011'|KEYC_CTRL|KEYC_SHIFT },