mirror of
				https://github.com/tmux/tmux.git
				synced 2025-11-04 00:56:10 +00:00 
			
		
		
		
	If an application gives the first parameter to OSC 52, validate and pass
on to outside terminal. GitHub issue 3192.
This commit is contained in:
		@@ -77,7 +77,7 @@ cmd_load_buffer_done(__unused struct client *c, const char *path, int error,
 | 
				
			|||||||
		} else if (tc != NULL &&
 | 
							} else if (tc != NULL &&
 | 
				
			||||||
		    tc->session != NULL &&
 | 
							    tc->session != NULL &&
 | 
				
			||||||
		    (~tc->flags & CLIENT_DEAD))
 | 
							    (~tc->flags & CLIENT_DEAD))
 | 
				
			||||||
			tty_set_selection(&tc->tty, copy, bsize);
 | 
								tty_set_selection(&tc->tty, "", copy, bsize);
 | 
				
			||||||
		if (tc != NULL)
 | 
							if (tc != NULL)
 | 
				
			||||||
			server_client_unref(tc);
 | 
								server_client_unref(tc);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -131,7 +131,7 @@ cmd_set_buffer_exec(struct cmd *self, struct cmdq_item *item)
 | 
				
			|||||||
		return (CMD_RETURN_ERROR);
 | 
							return (CMD_RETURN_ERROR);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	if (args_has(args, 'w') && tc != NULL)
 | 
						if (args_has(args, 'w') && tc != NULL)
 | 
				
			||||||
 		tty_set_selection(&tc->tty, bufdata, bufsize);
 | 
					 		tty_set_selection(&tc->tty, "", bufdata, bufsize);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return (CMD_RETURN_NORMAL);
 | 
						return (CMD_RETURN_NORMAL);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										11
									
								
								input.c
									
									
									
									
									
								
							
							
						
						
									
										11
									
								
								input.c
									
									
									
									
									
								
							@@ -2693,6 +2693,9 @@ input_osc_52(struct input_ctx *ictx, const char *p)
 | 
				
			|||||||
	int			 outlen, state;
 | 
						int			 outlen, state;
 | 
				
			||||||
	struct screen_write_ctx	 ctx;
 | 
						struct screen_write_ctx	 ctx;
 | 
				
			||||||
	struct paste_buffer	*pb;
 | 
						struct paste_buffer	*pb;
 | 
				
			||||||
 | 
						const char*              allow = "cpqs01234567";
 | 
				
			||||||
 | 
						char                     flags[sizeof allow] = "";
 | 
				
			||||||
 | 
						u_int			 i, j = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (wp == NULL)
 | 
						if (wp == NULL)
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
@@ -2707,6 +2710,12 @@ input_osc_52(struct input_ctx *ictx, const char *p)
 | 
				
			|||||||
		return;
 | 
							return;
 | 
				
			||||||
	log_debug("%s: %s", __func__, end);
 | 
						log_debug("%s: %s", __func__, end);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for (i = 0; p + i != end; i++) {
 | 
				
			||||||
 | 
							if (strchr(allow, p[i]) != NULL && strchr(flags, p[i]) == NULL)
 | 
				
			||||||
 | 
								flags[j++] = p[i];
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						log_debug("%s: %.*s %s", __func__, (int)(end - p - 1), p, flags);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (strcmp(end, "?") == 0) {
 | 
						if (strcmp(end, "?") == 0) {
 | 
				
			||||||
		if ((pb = paste_get_top(NULL)) != NULL)
 | 
							if ((pb = paste_get_top(NULL)) != NULL)
 | 
				
			||||||
			buf = paste_buffer_data(pb, &len);
 | 
								buf = paste_buffer_data(pb, &len);
 | 
				
			||||||
@@ -2728,7 +2737,7 @@ input_osc_52(struct input_ctx *ictx, const char *p)
 | 
				
			|||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_write_start_pane(&ctx, wp, NULL);
 | 
						screen_write_start_pane(&ctx, wp, NULL);
 | 
				
			||||||
	screen_write_setselection(&ctx, out, outlen);
 | 
						screen_write_setselection(&ctx, flags, out, outlen);
 | 
				
			||||||
	screen_write_stop(&ctx);
 | 
						screen_write_stop(&ctx);
 | 
				
			||||||
	notify_pane("pane-set-clipboard", wp);
 | 
						notify_pane("pane-set-clipboard", wp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -2085,12 +2085,14 @@ screen_write_overwrite(struct screen_write_ctx *ctx, struct grid_cell *gc,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
/* Set external clipboard. */
 | 
					/* Set external clipboard. */
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
screen_write_setselection(struct screen_write_ctx *ctx, u_char *str, u_int len)
 | 
					screen_write_setselection(struct screen_write_ctx *ctx, const char *flags,
 | 
				
			||||||
 | 
					    u_char *str, u_int len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	struct tty_ctx	ttyctx;
 | 
						struct tty_ctx	ttyctx;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	screen_write_initctx(ctx, &ttyctx, 0);
 | 
						screen_write_initctx(ctx, &ttyctx, 0);
 | 
				
			||||||
	ttyctx.ptr = str;
 | 
						ttyctx.ptr = str;
 | 
				
			||||||
 | 
						ttyctx.ptr2 = (void *)flags;
 | 
				
			||||||
	ttyctx.num = len;
 | 
						ttyctx.num = len;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	tty_write(tty_cmd_setselection, &ttyctx);
 | 
						tty_write(tty_cmd_setselection, &ttyctx);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										6
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										6
									
								
								tmux.h
									
									
									
									
									
								
							@@ -1421,6 +1421,7 @@ struct tty_ctx {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	u_int			 num;
 | 
						u_int			 num;
 | 
				
			||||||
	void			*ptr;
 | 
						void			*ptr;
 | 
				
			||||||
 | 
						void			*ptr2;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	/*
 | 
						/*
 | 
				
			||||||
	 * Cursor and region position before the screen was updated - this is
 | 
						 * Cursor and region position before the screen was updated - this is
 | 
				
			||||||
@@ -2278,7 +2279,7 @@ int	tty_open(struct tty *, char **);
 | 
				
			|||||||
void	tty_close(struct tty *);
 | 
					void	tty_close(struct tty *);
 | 
				
			||||||
void	tty_free(struct tty *);
 | 
					void	tty_free(struct tty *);
 | 
				
			||||||
void	tty_update_features(struct tty *);
 | 
					void	tty_update_features(struct tty *);
 | 
				
			||||||
void	tty_set_selection(struct tty *, const char *, size_t);
 | 
					void	tty_set_selection(struct tty *, const char *, const char *, size_t);
 | 
				
			||||||
void	tty_write(void (*)(struct tty *, const struct tty_ctx *),
 | 
					void	tty_write(void (*)(struct tty *, const struct tty_ctx *),
 | 
				
			||||||
	    struct tty_ctx *);
 | 
						    struct tty_ctx *);
 | 
				
			||||||
void	tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *);
 | 
					void	tty_cmd_alignmenttest(struct tty *, const struct tty_ctx *);
 | 
				
			||||||
@@ -2872,7 +2873,8 @@ void	 screen_write_collect_end(struct screen_write_ctx *);
 | 
				
			|||||||
void	 screen_write_collect_add(struct screen_write_ctx *,
 | 
					void	 screen_write_collect_add(struct screen_write_ctx *,
 | 
				
			||||||
	     const struct grid_cell *);
 | 
						     const struct grid_cell *);
 | 
				
			||||||
void	 screen_write_cell(struct screen_write_ctx *, const struct grid_cell *);
 | 
					void	 screen_write_cell(struct screen_write_ctx *, const struct grid_cell *);
 | 
				
			||||||
void	 screen_write_setselection(struct screen_write_ctx *, u_char *, u_int);
 | 
					void	 screen_write_setselection(struct screen_write_ctx *, const char *,
 | 
				
			||||||
 | 
						     u_char *, u_int);
 | 
				
			||||||
void	 screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int);
 | 
					void	 screen_write_rawstring(struct screen_write_ctx *, u_char *, u_int);
 | 
				
			||||||
void	 screen_write_alternateon(struct screen_write_ctx *,
 | 
					void	 screen_write_alternateon(struct screen_write_ctx *,
 | 
				
			||||||
	     struct grid_cell *, int);
 | 
						     struct grid_cell *, int);
 | 
				
			||||||
 
 | 
				
			|||||||
							
								
								
									
										9
									
								
								tty.c
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								tty.c
									
									
									
									
									
								
							@@ -671,7 +671,7 @@ static void
 | 
				
			|||||||
tty_force_cursor_colour(struct tty *tty, int c)
 | 
					tty_force_cursor_colour(struct tty *tty, int c)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	u_char	r, g, b;
 | 
						u_char	r, g, b;
 | 
				
			||||||
	char	s[13] = "";
 | 
						char	s[13];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (c != -1)
 | 
						if (c != -1)
 | 
				
			||||||
		c = colour_force_rgb(c);
 | 
							c = colour_force_rgb(c);
 | 
				
			||||||
@@ -2082,11 +2082,12 @@ tty_cmd_cells(struct tty *tty, const struct tty_ctx *ctx)
 | 
				
			|||||||
void
 | 
					void
 | 
				
			||||||
tty_cmd_setselection(struct tty *tty, const struct tty_ctx *ctx)
 | 
					tty_cmd_setselection(struct tty *tty, const struct tty_ctx *ctx)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	tty_set_selection(tty, ctx->ptr, ctx->num);
 | 
						tty_set_selection(tty, ctx->ptr2, ctx->ptr, ctx->num);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
tty_set_selection(struct tty *tty, const char *buf, size_t len)
 | 
					tty_set_selection(struct tty *tty, const char *flags, const char *buf,
 | 
				
			||||||
 | 
					    size_t len)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	char	*encoded;
 | 
						char	*encoded;
 | 
				
			||||||
	size_t	 size;
 | 
						size_t	 size;
 | 
				
			||||||
@@ -2101,7 +2102,7 @@ tty_set_selection(struct tty *tty, const char *buf, size_t len)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	b64_ntop(buf, len, encoded, size);
 | 
						b64_ntop(buf, len, encoded, size);
 | 
				
			||||||
	tty->flags |= TTY_NOBLOCK;
 | 
						tty->flags |= TTY_NOBLOCK;
 | 
				
			||||||
	tty_putcode_ptr2(tty, TTYC_MS, "", encoded);
 | 
						tty_putcode_ptr2(tty, TTYC_MS, flags, encoded);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free(encoded);
 | 
						free(encoded);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -4570,7 +4570,7 @@ window_copy_copy_buffer(struct window_mode_entry *wme, const char *prefix,
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (options_get_number(global_options, "set-clipboard") != 0) {
 | 
						if (options_get_number(global_options, "set-clipboard") != 0) {
 | 
				
			||||||
		screen_write_start_pane(&ctx, wp, NULL);
 | 
							screen_write_start_pane(&ctx, wp, NULL);
 | 
				
			||||||
		screen_write_setselection(&ctx, buf, len);
 | 
							screen_write_setselection(&ctx, "", buf, len);
 | 
				
			||||||
		screen_write_stop(&ctx);
 | 
							screen_write_stop(&ctx);
 | 
				
			||||||
		notify_pane("pane-set-clipboard", wp);
 | 
							notify_pane("pane-set-clipboard", wp);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
@@ -4644,7 +4644,7 @@ window_copy_append_selection(struct window_mode_entry *wme)
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
	if (options_get_number(global_options, "set-clipboard") != 0) {
 | 
						if (options_get_number(global_options, "set-clipboard") != 0) {
 | 
				
			||||||
		screen_write_start_pane(&ctx, wp, NULL);
 | 
							screen_write_start_pane(&ctx, wp, NULL);
 | 
				
			||||||
		screen_write_setselection(&ctx, buf, len);
 | 
							screen_write_setselection(&ctx, "", buf, len);
 | 
				
			||||||
		screen_write_stop(&ctx);
 | 
							screen_write_stop(&ctx);
 | 
				
			||||||
		notify_pane("pane-set-clipboard", wp);
 | 
							notify_pane("pane-set-clipboard", wp);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user