mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Don't limit the DCS buffer to 256 bytes, expand it as needed. Requested
by Suraj Kurapati.
This commit is contained in:
		
							
								
								
									
										55
									
								
								input.c
									
									
									
									
									
								
							
							
						
						
									
										55
									
								
								input.c
									
									
									
									
									
								
							| @@ -55,6 +55,7 @@ void	input_set_state(struct window_pane *, const struct input_transition *); | |||||||
|  |  | ||||||
| /* Transition entry/exit handlers. */ | /* Transition entry/exit handlers. */ | ||||||
| void	input_clear(struct input_ctx *); | void	input_clear(struct input_ctx *); | ||||||
|  | void	input_ground(struct input_ctx *); | ||||||
| void	input_enter_osc(struct input_ctx *); | void	input_enter_osc(struct input_ctx *); | ||||||
| void	input_exit_osc(struct input_ctx *); | void	input_exit_osc(struct input_ctx *); | ||||||
| void	input_enter_apc(struct input_ctx *); | void	input_enter_apc(struct input_ctx *); | ||||||
| @@ -242,7 +243,7 @@ const struct input_transition input_state_utf8_one_table[]; | |||||||
| /* ground state definition. */ | /* ground state definition. */ | ||||||
| const struct input_state input_state_ground = { | const struct input_state input_state_ground = { | ||||||
| 	"ground", | 	"ground", | ||||||
| 	NULL, NULL, | 	input_ground, NULL, | ||||||
| 	input_state_ground_table | 	input_state_ground_table | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -701,6 +702,12 @@ input_init(struct window_pane *wp) | |||||||
| 	*ictx->param_buf = '\0'; | 	*ictx->param_buf = '\0'; | ||||||
| 	ictx->param_len = 0; | 	ictx->param_len = 0; | ||||||
|  |  | ||||||
|  | 	ictx->input_space = INPUT_BUF_START; | ||||||
|  | 	ictx->input_buf = xmalloc(INPUT_BUF_START); | ||||||
|  |  | ||||||
|  | 	*ictx->input_buf = '\0'; | ||||||
|  | 	ictx->input_len = 0; | ||||||
|  |  | ||||||
| 	ictx->state = &input_state_ground; | 	ictx->state = &input_state_ground; | ||||||
| 	ictx->flags = 0; | 	ictx->flags = 0; | ||||||
|  |  | ||||||
| @@ -711,8 +718,11 @@ input_init(struct window_pane *wp) | |||||||
| void | void | ||||||
| input_free(struct window_pane *wp) | input_free(struct window_pane *wp) | ||||||
| { | { | ||||||
| 	if (wp != NULL) | 	if (wp == NULL) | ||||||
| 		evbuffer_free(wp->ictx.since_ground); | 		return; | ||||||
|  |  | ||||||
|  | 	free(wp->ictx.input_buf); | ||||||
|  | 	evbuffer_free(wp->ictx.since_ground); | ||||||
| } | } | ||||||
|  |  | ||||||
| /* Change input state. */ | /* Change input state. */ | ||||||
| @@ -720,14 +730,9 @@ void | |||||||
| input_set_state(struct window_pane *wp, const struct input_transition *itr) | input_set_state(struct window_pane *wp, const struct input_transition *itr) | ||||||
| { | { | ||||||
| 	struct input_ctx	*ictx = &wp->ictx; | 	struct input_ctx	*ictx = &wp->ictx; | ||||||
| 	struct evbuffer		*ground_evb = ictx->since_ground; |  | ||||||
|  |  | ||||||
| 	if (ictx->state->exit != NULL) | 	if (ictx->state->exit != NULL) | ||||||
| 		ictx->state->exit(ictx); | 		ictx->state->exit(ictx); | ||||||
|  |  | ||||||
| 	if (itr->state == &input_state_ground) |  | ||||||
| 		evbuffer_drain(ground_evb, EVBUFFER_LENGTH(ground_evb)); |  | ||||||
|  |  | ||||||
| 	ictx->state = itr->state; | 	ictx->state = itr->state; | ||||||
| 	if (ictx->state->enter != NULL) | 	if (ictx->state->enter != NULL) | ||||||
| 		ictx->state->enter(ictx); | 		ictx->state->enter(ictx); | ||||||
| @@ -882,6 +887,18 @@ input_clear(struct input_ctx *ictx) | |||||||
| 	ictx->flags &= ~INPUT_DISCARD; | 	ictx->flags &= ~INPUT_DISCARD; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | /* Reset for ground state. */ | ||||||
|  | void | ||||||
|  | input_ground(struct input_ctx *ictx) | ||||||
|  | { | ||||||
|  | 	evbuffer_drain(ictx->since_ground, EVBUFFER_LENGTH(ictx->since_ground)); | ||||||
|  |  | ||||||
|  | 	if (ictx->input_space > INPUT_BUF_START) { | ||||||
|  | 		ictx->input_space = INPUT_BUF_START; | ||||||
|  | 		ictx->input_buf = xrealloc(ictx->input_buf, 1, INPUT_BUF_START); | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| /* Output this character to the screen. */ | /* Output this character to the screen. */ | ||||||
| int | int | ||||||
| input_print(struct input_ctx *ictx) | input_print(struct input_ctx *ictx) | ||||||
| @@ -924,12 +941,20 @@ input_parameter(struct input_ctx *ictx) | |||||||
| int | int | ||||||
| input_input(struct input_ctx *ictx) | input_input(struct input_ctx *ictx) | ||||||
| { | { | ||||||
| 	if (ictx->input_len == (sizeof ictx->input_buf) - 1) | 	size_t available; | ||||||
| 		ictx->flags |= INPUT_DISCARD; |  | ||||||
| 	else { | 	available = ictx->input_space; | ||||||
| 		ictx->input_buf[ictx->input_len++] = ictx->ch; | 	while (ictx->input_len + 1 >= available) { | ||||||
| 		ictx->input_buf[ictx->input_len] = '\0'; | 		available *= 2; | ||||||
|  | 		if (available > INPUT_BUF_LIMIT) { | ||||||
|  | 			ictx->flags |= INPUT_DISCARD; | ||||||
|  | 			return (0); | ||||||
|  | 		} | ||||||
|  | 		ictx->input_buf = xrealloc(ictx->input_buf, 1, available); | ||||||
|  | 		ictx->input_space = available; | ||||||
| 	} | 	} | ||||||
|  | 	ictx->input_buf[ictx->input_len++] = ictx->ch; | ||||||
|  | 	ictx->input_buf[ictx->input_len] = '\0'; | ||||||
|  |  | ||||||
| 	return (0); | 	return (0); | ||||||
| } | } | ||||||
| @@ -1666,8 +1691,8 @@ input_enter_osc(struct input_ctx *ictx) | |||||||
| void | void | ||||||
| input_exit_osc(struct input_ctx *ictx) | input_exit_osc(struct input_ctx *ictx) | ||||||
| { | { | ||||||
| 	u_char *p = ictx->input_buf; | 	u_char	*p = ictx->input_buf; | ||||||
| 	int	option; | 	int	 option; | ||||||
|  |  | ||||||
| 	if (ictx->flags & INPUT_DISCARD) | 	if (ictx->flags & INPUT_DISCARD) | ||||||
| 		return; | 		return; | ||||||
|   | |||||||
							
								
								
									
										5
									
								
								tmux.h
									
									
									
									
									
								
							
							
						
						
									
										5
									
								
								tmux.h
									
									
									
									
									
								
							| @@ -818,8 +818,11 @@ struct input_ctx { | |||||||
| 	u_char			param_buf[64]; | 	u_char			param_buf[64]; | ||||||
| 	size_t			param_len; | 	size_t			param_len; | ||||||
|  |  | ||||||
| 	u_char			input_buf[256]; | #define INPUT_BUF_START 32 | ||||||
|  | #define INPUT_BUF_LIMIT 1048576 | ||||||
|  | 	u_char*			input_buf; | ||||||
| 	size_t			input_len; | 	size_t			input_len; | ||||||
|  | 	size_t			input_space; | ||||||
|  |  | ||||||
| 	int			param_list[24];	/* -1 not present */ | 	int			param_list[24];	/* -1 not present */ | ||||||
| 	u_int			param_list_len; | 	u_int			param_list_len; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm