aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Ian Fan <ianfan0@gmail.com>2019-02-14 15:43:34 +0000
committerLibravatar Drew DeVault <sir@cmpwn.com>2019-02-18 15:11:48 -0500
commit47abc45e867043b9144cc7a7181d08203d7ec4f2 (patch)
treeea3d270c931178a43eb8e28657808c84570b3ef2
parentapply_output_config: dpms on before modeset (diff)
downloadsway-47abc45e867043b9144cc7a7181d08203d7ec4f2.tar.gz
sway-47abc45e867043b9144cc7a7181d08203d7ec4f2.tar.zst
sway-47abc45e867043b9144cc7a7181d08203d7ec4f2.zip
swaybar: prevent signal handler from firing during termination
This prevents a heap-use-after-free crash when sway terminates.
-rw-r--r--include/swaybar/bar.h2
-rw-r--r--swaybar/bar.c6
-rw-r--r--swaybar/main.c14
3 files changed, 10 insertions, 12 deletions
diff --git a/include/swaybar/bar.h b/include/swaybar/bar.h
index 2d9ba0d9..2518d5aa 100644
--- a/include/swaybar/bar.h
+++ b/include/swaybar/bar.h
@@ -46,6 +46,8 @@ struct swaybar {
46#if HAVE_TRAY 46#if HAVE_TRAY
47 struct swaybar_tray *tray; 47 struct swaybar_tray *tray;
48#endif 48#endif
49
50 bool running;
49}; 51};
50 52
51struct swaybar_output { 53struct swaybar_output {
diff --git a/swaybar/bar.c b/swaybar/bar.c
index a1f7bfdb..db1c1222 100644
--- a/swaybar/bar.c
+++ b/swaybar/bar.c
@@ -4,6 +4,7 @@
4#include <fcntl.h> 4#include <fcntl.h>
5#include <poll.h> 5#include <poll.h>
6#include <signal.h> 6#include <signal.h>
7#include <stdbool.h>
7#include <stdlib.h> 8#include <stdlib.h>
8#include <string.h> 9#include <string.h>
9#include <sys/wait.h> 10#include <sys/wait.h>
@@ -403,8 +404,7 @@ bool bar_setup(struct swaybar *bar, const char *socket_path) {
403static void display_in(int fd, short mask, void *data) { 404static void display_in(int fd, short mask, void *data) {
404 struct swaybar *bar = data; 405 struct swaybar *bar = data;
405 if (wl_display_dispatch(bar->display) == -1) { 406 if (wl_display_dispatch(bar->display) == -1) {
406 bar_teardown(bar); 407 bar->running = false;
407 exit(0);
408 } 408 }
409} 409}
410 410
@@ -439,7 +439,7 @@ void bar_run(struct swaybar *bar) {
439 loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, bar->tray->bus); 439 loop_add_fd(bar->eventloop, bar->tray->fd, POLLIN, tray_in, bar->tray->bus);
440 } 440 }
441#endif 441#endif
442 while (1) { 442 while (bar->running) {
443 errno = 0; 443 errno = 0;
444 if (wl_display_flush(bar->display) == -1 && errno != EAGAIN) { 444 if (wl_display_flush(bar->display) == -1 && errno != EAGAIN) {
445 break; 445 break;
diff --git a/swaybar/main.c b/swaybar/main.c
index 4ef74629..108b16e9 100644
--- a/swaybar/main.c
+++ b/swaybar/main.c
@@ -11,13 +11,7 @@
11static struct swaybar swaybar; 11static struct swaybar swaybar;
12 12
13void sig_handler(int signal) { 13void sig_handler(int signal) {
14 bar_teardown(&swaybar); 14 swaybar.running = false;
15 exit(0);
16}
17
18void sway_terminate(int code) {
19 bar_teardown(&swaybar);
20 exit(code);
21} 15}
22 16
23int main(int argc, char **argv) { 17int main(int argc, char **argv) {
@@ -93,8 +87,6 @@ int main(int argc, char **argv) {
93 } 87 }
94 } 88 }
95 89
96 signal(SIGTERM, sig_handler);
97
98 if (!bar_setup(&swaybar, socket_path)) { 90 if (!bar_setup(&swaybar, socket_path)) {
99 free(socket_path); 91 free(socket_path);
100 return 1; 92 return 1;
@@ -102,6 +94,10 @@ int main(int argc, char **argv) {
102 94
103 free(socket_path); 95 free(socket_path);
104 96
97 signal(SIGINT, sig_handler);
98 signal(SIGTERM, sig_handler);
99
100 swaybar.running = true;
105 bar_run(&swaybar); 101 bar_run(&swaybar);
106 bar_teardown(&swaybar); 102 bar_teardown(&swaybar);
107 return 0; 103 return 0;