mirror of
				https://github.com/swaywm/sway.git
				synced 2025-10-29 05:40:18 -04:00 
			
		
		
		
	swaybar: prevent signal handler from firing during termination
This prevents a heap-use-after-free crash when sway terminates.
This commit is contained in:
		
							parent
							
								
									96de2b539c
								
							
						
					
					
						commit
						5484f308b9
					
				
					 3 changed files with 10 additions and 12 deletions
				
			
		|  | @ -46,6 +46,8 @@ struct swaybar { | |||
| #if HAVE_TRAY | ||||
| 	struct swaybar_tray *tray; | ||||
| #endif | ||||
| 
 | ||||
| 	bool running; | ||||
| }; | ||||
| 
 | ||||
| struct swaybar_output { | ||||
|  |  | |||
|  | @ -4,6 +4,7 @@ | |||
| #include <fcntl.h> | ||||
| #include <poll.h> | ||||
| #include <signal.h> | ||||
| #include <stdbool.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <sys/wait.h> | ||||
|  | @ -403,8 +404,7 @@ bool bar_setup(struct swaybar *bar, const char *socket_path) { | |||
| static void display_in(int fd, short mask, void *data) { | ||||
| 	struct swaybar *bar = data; | ||||
| 	if (wl_display_dispatch(bar->display) == -1) { | ||||
| 		bar_teardown(bar); | ||||
| 		exit(0); | ||||
| 		bar->running = false; | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
|  | @ -439,7 +439,7 @@ void bar_run(struct swaybar *bar) { | |||
| 		loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, bar->tray->bus); | ||||
| 	} | ||||
| #endif | ||||
| 	while (1) { | ||||
| 	while (bar->running) { | ||||
| 		errno = 0; | ||||
| 		if (wl_display_flush(bar->display) == -1 && errno != EAGAIN) { | ||||
| 			break; | ||||
|  |  | |||
|  | @ -11,13 +11,7 @@ | |||
| static struct swaybar swaybar; | ||||
| 
 | ||||
| void sig_handler(int signal) { | ||||
| 	bar_teardown(&swaybar); | ||||
| 	exit(0); | ||||
| } | ||||
| 
 | ||||
| void sway_terminate(int code) { | ||||
| 	bar_teardown(&swaybar); | ||||
| 	exit(code); | ||||
| 	swaybar.running = false; | ||||
| } | ||||
| 
 | ||||
| int main(int argc, char **argv) { | ||||
|  | @ -93,8 +87,6 @@ int main(int argc, char **argv) { | |||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	signal(SIGTERM, sig_handler); | ||||
| 
 | ||||
| 	if (!bar_setup(&swaybar, socket_path)) { | ||||
| 		free(socket_path); | ||||
| 		return 1; | ||||
|  | @ -102,6 +94,10 @@ int main(int argc, char **argv) { | |||
| 
 | ||||
| 	free(socket_path); | ||||
| 
 | ||||
| 	signal(SIGINT, sig_handler); | ||||
| 	signal(SIGTERM, sig_handler); | ||||
| 
 | ||||
| 	swaybar.running = true; | ||||
| 	bar_run(&swaybar); | ||||
| 	bar_teardown(&swaybar); | ||||
| 	return 0; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Ian Fan
						Ian Fan