mirror of
				https://github.com/tmux/tmux.git
				synced 2025-10-26 12:27:15 +00:00 
			
		
		
		
	Add a 10 second timeout to prevent searches taking too much time, from
Anindya Mukherjee.
This commit is contained in:
		| @@ -261,6 +261,9 @@ struct window_copy_mode_data { | |||||||
| 	int		 searchy; | 	int		 searchy; | ||||||
| 	int		 searcho; | 	int		 searcho; | ||||||
|  |  | ||||||
|  | 	int		 timeout;	/* search has timed out */ | ||||||
|  | #define WINDOW_COPY_SEARCH_TIMEOUT 10 | ||||||
|  |  | ||||||
| 	int		 jumptype; | 	int		 jumptype; | ||||||
| 	char		 jumpchar; | 	char		 jumpchar; | ||||||
|  |  | ||||||
| @@ -316,6 +319,7 @@ window_copy_common_init(struct window_mode_entry *wme) | |||||||
| 	} | 	} | ||||||
| 	data->searchmark = NULL; | 	data->searchmark = NULL; | ||||||
| 	data->searchx = data->searchy = data->searcho = -1; | 	data->searchx = data->searchy = data->searcho = -1; | ||||||
|  | 	data->timeout = 0; | ||||||
|  |  | ||||||
| 	data->jumptype = WINDOW_COPY_OFF; | 	data->jumptype = WINDOW_COPY_OFF; | ||||||
| 	data->jumpchar = '\0'; | 	data->jumpchar = '\0'; | ||||||
| @@ -680,8 +684,8 @@ window_copy_resize(struct window_mode_entry *wme, u_int sx, u_int sy) | |||||||
| 	window_copy_write_lines(wme, &ctx, 0, screen_size_y(s) - 1); | 	window_copy_write_lines(wme, &ctx, 0, screen_size_y(s) - 1); | ||||||
| 	screen_write_stop(&ctx); | 	screen_write_stop(&ctx); | ||||||
|  |  | ||||||
| 	if (search) | 	if (search && !data->timeout) | ||||||
| 		window_copy_search_marks(wme, NULL, 1); | 		window_copy_search_marks(wme, NULL, data->searchregex); | ||||||
| 	data->searchx = data->cx; | 	data->searchx = data->cx; | ||||||
| 	data->searchy = data->cy; | 	data->searchy = data->cy; | ||||||
| 	data->searcho = data->oy; | 	data->searcho = data->oy; | ||||||
| @@ -1800,6 +1804,7 @@ window_copy_cmd_search_backward(struct window_copy_cmd_state *cs) | |||||||
| 	if (data->searchstr != NULL) { | 	if (data->searchstr != NULL) { | ||||||
| 		data->searchtype = WINDOW_COPY_SEARCHUP; | 		data->searchtype = WINDOW_COPY_SEARCHUP; | ||||||
| 		data->searchregex = 1; | 		data->searchregex = 1; | ||||||
|  | 		data->timeout = 0; | ||||||
| 		for (; np != 0; np--) | 		for (; np != 0; np--) | ||||||
| 			window_copy_search_up(wme, 1); | 			window_copy_search_up(wme, 1); | ||||||
| 	} | 	} | ||||||
| @@ -1819,6 +1824,7 @@ window_copy_cmd_search_backward_text(struct window_copy_cmd_state *cs) | |||||||
| 	if (data->searchstr != NULL) { | 	if (data->searchstr != NULL) { | ||||||
| 		data->searchtype = WINDOW_COPY_SEARCHUP; | 		data->searchtype = WINDOW_COPY_SEARCHUP; | ||||||
| 		data->searchregex = 0; | 		data->searchregex = 0; | ||||||
|  | 		data->timeout = 0; | ||||||
| 		for (; np != 0; np--) | 		for (; np != 0; np--) | ||||||
| 			window_copy_search_up(wme, 0); | 			window_copy_search_up(wme, 0); | ||||||
| 	} | 	} | ||||||
| @@ -1838,6 +1844,7 @@ window_copy_cmd_search_forward(struct window_copy_cmd_state *cs) | |||||||
| 	if (data->searchstr != NULL) { | 	if (data->searchstr != NULL) { | ||||||
| 		data->searchtype = WINDOW_COPY_SEARCHDOWN; | 		data->searchtype = WINDOW_COPY_SEARCHDOWN; | ||||||
| 		data->searchregex = 1; | 		data->searchregex = 1; | ||||||
|  | 		data->timeout = 0; | ||||||
| 		for (; np != 0; np--) | 		for (; np != 0; np--) | ||||||
| 			window_copy_search_down(wme, 1); | 			window_copy_search_down(wme, 1); | ||||||
| 	} | 	} | ||||||
| @@ -1857,6 +1864,7 @@ window_copy_cmd_search_forward_text(struct window_copy_cmd_state *cs) | |||||||
| 	if (data->searchstr != NULL) { | 	if (data->searchstr != NULL) { | ||||||
| 		data->searchtype = WINDOW_COPY_SEARCHDOWN; | 		data->searchtype = WINDOW_COPY_SEARCHDOWN; | ||||||
| 		data->searchregex = 0; | 		data->searchregex = 0; | ||||||
|  | 		data->timeout = 0; | ||||||
| 		for (; np != 0; np--) | 		for (; np != 0; np--) | ||||||
| 			window_copy_search_down(wme, 0); | 			window_copy_search_down(wme, 0); | ||||||
| 	} | 	} | ||||||
| @@ -1873,6 +1881,8 @@ window_copy_cmd_search_backward_incremental(struct window_copy_cmd_state *cs) | |||||||
| 	char				 prefix; | 	char				 prefix; | ||||||
| 	enum window_copy_cmd_action	 action = WINDOW_COPY_CMD_NOTHING; | 	enum window_copy_cmd_action	 action = WINDOW_COPY_CMD_NOTHING; | ||||||
|  |  | ||||||
|  | 	data->timeout = 0; | ||||||
|  |  | ||||||
| 	prefix = *argument++; | 	prefix = *argument++; | ||||||
| 	if (data->searchx == -1 || data->searchy == -1) { | 	if (data->searchx == -1 || data->searchy == -1) { | ||||||
| 		data->searchx = data->cx; | 		data->searchx = data->cx; | ||||||
| @@ -1924,6 +1934,8 @@ window_copy_cmd_search_forward_incremental(struct window_copy_cmd_state *cs) | |||||||
| 	char				 prefix; | 	char				 prefix; | ||||||
| 	enum window_copy_cmd_action	 action = WINDOW_COPY_CMD_NOTHING; | 	enum window_copy_cmd_action	 action = WINDOW_COPY_CMD_NOTHING; | ||||||
|  |  | ||||||
|  | 	data->timeout = 0; | ||||||
|  |  | ||||||
| 	prefix = *argument++; | 	prefix = *argument++; | ||||||
| 	if (data->searchx == -1 || data->searchy == -1) { | 	if (data->searchx == -1 || data->searchy == -1) { | ||||||
| 		data->searchx = data->cx; | 		data->searchx = data->cx; | ||||||
| @@ -2721,6 +2733,9 @@ window_copy_search(struct window_mode_entry *wme, int direction, int regex) | |||||||
| 	if (regex && str[strcspn(str, "^$*+()?[].\\")] == '\0') | 	if (regex && str[strcspn(str, "^$*+()?[].\\")] == '\0') | ||||||
| 		regex = 0; | 		regex = 0; | ||||||
|  |  | ||||||
|  | 	if (data->timeout) | ||||||
|  | 		return (0); | ||||||
|  |  | ||||||
| 	free(wp->searchstr); | 	free(wp->searchstr); | ||||||
| 	wp->searchstr = xstrdup(str); | 	wp->searchstr = xstrdup(str); | ||||||
| 	wp->searchregex = regex; | 	wp->searchregex = regex; | ||||||
| @@ -2768,6 +2783,7 @@ window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp, | |||||||
| 	u_int				 ssize = 1; | 	u_int				 ssize = 1; | ||||||
| 	char				*sbuf; | 	char				*sbuf; | ||||||
| 	regex_t				 reg; | 	regex_t				 reg; | ||||||
|  | 	time_t				 tstart, t; | ||||||
|  |  | ||||||
| 	if (ssp == NULL) { | 	if (ssp == NULL) { | ||||||
| 		width = screen_write_strlen("%s", data->searchstr); | 		width = screen_write_strlen("%s", data->searchstr); | ||||||
| @@ -2797,6 +2813,7 @@ window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp, | |||||||
| 			return (0); | 			return (0); | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	time(&tstart); | ||||||
| 	for (py = 0; py < gd->hsize + gd->sy; py++) { | 	for (py = 0; py < gd->hsize + gd->sy; py++) { | ||||||
| 		px = 0; | 		px = 0; | ||||||
| 		for (;;) { | 		for (;;) { | ||||||
| @@ -2822,11 +2839,21 @@ window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp, | |||||||
|  |  | ||||||
| 			px++; | 			px++; | ||||||
| 		} | 		} | ||||||
|  |  | ||||||
|  | 		time(&t); | ||||||
|  | 		if (t - tstart > WINDOW_COPY_SEARCH_TIMEOUT) { | ||||||
|  | 			data->timeout = 1; | ||||||
|  | 			break; | ||||||
|  | 		} | ||||||
| 	} | 	} | ||||||
| 	if (regex) { | 	if (regex) { | ||||||
| 		free(sbuf); | 		free(sbuf); | ||||||
| 		regfree(®); | 		regfree(®); | ||||||
| 	} | 	} | ||||||
|  | 	if (data->timeout) { | ||||||
|  | 		window_copy_clear_marks(wme); | ||||||
|  | 		return (1); | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	if (which != -1) | 	if (which != -1) | ||||||
| 		data->searchthis = 1 + nfound - which; | 		data->searchthis = 1 + nfound - which; | ||||||
| @@ -2836,7 +2863,7 @@ window_copy_search_marks(struct window_mode_entry *wme, struct screen *ssp, | |||||||
|  |  | ||||||
| 	if (ssp == &ss) | 	if (ssp == &ss) | ||||||
| 		screen_free(&ss); | 		screen_free(&ss); | ||||||
| 	return (nfound); | 	return (1); | ||||||
| } | } | ||||||
|  |  | ||||||
| static void | static void | ||||||
| @@ -2895,8 +2922,15 @@ window_copy_write_line(struct window_mode_entry *wme, | |||||||
|  |  | ||||||
| 	if (py == 0 && s->rupper < s->rlower && !data->hide_position) { | 	if (py == 0 && s->rupper < s->rlower && !data->hide_position) { | ||||||
| 		if (data->searchmark == NULL) { | 		if (data->searchmark == NULL) { | ||||||
| 			size = xsnprintf(hdr, sizeof hdr, | 			if (data->timeout) { | ||||||
| 			    "[%u/%u]", data->oy, screen_hsize(data->backing)); | 				size = xsnprintf(hdr, sizeof hdr, | ||||||
|  | 			    		"(timed out) [%u/%u]", data->oy, | ||||||
|  | 					screen_hsize(data->backing)); | ||||||
|  | 			} else { | ||||||
|  | 				size = xsnprintf(hdr, sizeof hdr, | ||||||
|  | 					"[%u/%u]", data->oy, | ||||||
|  | 					screen_hsize(data->backing)); | ||||||
|  | 			} | ||||||
| 		} else { | 		} else { | ||||||
| 			if (data->searchthis == -1) { | 			if (data->searchthis == -1) { | ||||||
| 				size = xsnprintf(hdr, sizeof hdr, | 				size = xsnprintf(hdr, sizeof hdr, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 nicm
					nicm