From 265164d251f427bf9275c355a4f205c781d70b20 Mon Sep 17 00:00:00 2001
From: nicm <nicm>
Date: Mon, 3 Feb 2020 13:46:27 +0000
Subject: [PATCH] Instead of passing titles through vis() which doubles
 backslashes, just ignore any containing control characters or invalid UTF-8.
 GitHub issue 2070.

---
 cmd-select-pane.c |  4 ++--
 input.c           | 10 +++-------
 screen.c          |  9 +++++++--
 tmux.h            |  2 +-
 4 files changed, 13 insertions(+), 12 deletions(-)

diff --git a/cmd-select-pane.c b/cmd-select-pane.c
index 6542c919..c63c7e61 100644
--- a/cmd-select-pane.c
+++ b/cmd-select-pane.c
@@ -197,8 +197,8 @@ cmd_select_pane_exec(struct cmd *self, struct cmdq_item *item)
 	if (args_has(self->args, 'T')) {
 		pane_title = format_single(item, args_get(self->args, 'T'),
 		    c, s, wl, wp);
-		screen_set_title(&wp->base, pane_title);
-		server_status_window(wp->window);
+		if (screen_set_title(&wp->base, pane_title))
+			server_status_window(wp->window);
 		free(pane_title);
 		return (CMD_RETURN_NORMAL);
 	}
diff --git a/input.c b/input.c
index ea9320d1..82d2b398 100644
--- a/input.c
+++ b/input.c
@@ -2213,10 +2213,8 @@ input_exit_osc(struct input_ctx *ictx)
 	switch (option) {
 	case 0:
 	case 2:
-		if (utf8_isvalid(p)) {
-			screen_set_title(sctx->s, p);
+		if (screen_set_title(sctx->s, p))
 			server_status_window(ictx->wp->window);
-		}
 		break;
 	case 4:
 		input_osc_4(ictx, p);
@@ -2274,10 +2272,8 @@ input_exit_apc(struct input_ctx *ictx)
 		return;
 	log_debug("%s: \"%s\"", __func__, ictx->input_buf);
 
-	if (!utf8_isvalid(ictx->input_buf))
-		return;
-	screen_set_title(sctx->s, ictx->input_buf);
-	server_status_window(ictx->wp->window);
+	if (screen_set_title(sctx->s, ictx->input_buf))
+		server_status_window(ictx->wp->window);
 }
 
 /* Rename string started. */
diff --git a/screen.c b/screen.c
index 9db0f609..5aa30271 100644
--- a/screen.c
+++ b/screen.c
@@ -152,11 +152,16 @@ screen_set_cursor_colour(struct screen *s, const char *colour)
 }
 
 /* Set screen title. */
-void
+int
 screen_set_title(struct screen *s, const char *title)
 {
+	char	*cp;
+
+	if (!utf8_isvalid(title))
+		return (0);
 	free(s->title);
-	utf8_stravis(&s->title, title, VIS_OCTAL|VIS_CSTYLE|VIS_TAB|VIS_NL);
+	s->title = xstrdup(title);
+	return (1);
 }
 
 /* Set screen path. */
diff --git a/tmux.h b/tmux.h
index 418f0a44..bc4b0d6c 100644
--- a/tmux.h
+++ b/tmux.h
@@ -2424,7 +2424,7 @@ void	 screen_free(struct screen *);
 void	 screen_reset_tabs(struct screen *);
 void	 screen_set_cursor_style(struct screen *, u_int);
 void	 screen_set_cursor_colour(struct screen *, const char *);
-void	 screen_set_title(struct screen *, const char *);
+int	 screen_set_title(struct screen *, const char *);
 void	 screen_set_path(struct screen *, const char *);
 void	 screen_push_title(struct screen *);
 void	 screen_pop_title(struct screen *);