aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Alyssa Ross <hi@alyssa.is>2019-05-16 22:56:58 +0000
committerLibravatar Drew DeVault <sir@cmpwn.com>2019-05-21 10:16:26 -0400
commite12b3667a94ce78adb974cb4f94d0ffbe58c4290 (patch)
treedbf350b55669a112f7dd27ad3bcaee94b7b0dae1
parentinput/keyboard: attempt default keymap on failure (diff)
downloadsway-e12b3667a94ce78adb974cb4f94d0ffbe58c4290.tar.gz
sway-e12b3667a94ce78adb974cb4f94d0ffbe58c4290.tar.zst
sway-e12b3667a94ce78adb974cb4f94d0ffbe58c4290.zip
bar: fix segfault with missing or invalid bar id1.1-rc3
Prior to this patch, if I ran something like this, sway would crash: swaymsg bar height 50 or swaymsg bar not-a-bar-id color bg #ff0000 This was in contrast to other bar subcommands, like status_command, which would exit with a "No bar defined" message. The difference between the subcommands that crashed and the ones that exited was that some subcommands had a check to see if a bar was specified, while others just assumed that it had been and carried on until they segfaulted. Because this check was identical in every subcommand it was present in, and I couldn't think of a case where it would be valid to run a bar subcommand without specifying which bar to apply it to, I moved this check from individual subcommands into the bar command, which is already responsible for actually setting the specified bar. This reduced code duplication, and fixed the crash for the subcommands that were missing this check.
-rw-r--r--sway/commands/bar.c38
-rw-r--r--sway/commands/bar/bind.c3
-rw-r--r--sway/commands/bar/binding_mode_indicator.c5
-rw-r--r--sway/commands/bar/font.c3
-rw-r--r--sway/commands/bar/gaps.c3
-rw-r--r--sway/commands/bar/icon_theme.c4
-rw-r--r--sway/commands/bar/modifier.c4
-rw-r--r--sway/commands/bar/output.c3
-rw-r--r--sway/commands/bar/pango_markup.c7
-rw-r--r--sway/commands/bar/position.c3
-rw-r--r--sway/commands/bar/separator_symbol.c3
-rw-r--r--sway/commands/bar/status_command.c3
-rw-r--r--sway/commands/bar/strip_workspace_name.c3
-rw-r--r--sway/commands/bar/strip_workspace_numbers.c5
-rw-r--r--sway/commands/bar/swaybar_command.c3
-rw-r--r--sway/commands/bar/tray_bind.c3
-rw-r--r--sway/commands/bar/tray_output.c4
-rw-r--r--sway/commands/bar/tray_padding.c3
-rw-r--r--sway/commands/bar/workspace_buttons.c5
-rw-r--r--sway/commands/bar/wrap_scroll.c5
20 files changed, 27 insertions, 83 deletions
diff --git a/sway/commands/bar.c b/sway/commands/bar.c
index 73be7040..9c7357dd 100644
--- a/sway/commands/bar.c
+++ b/sway/commands/bar.c
@@ -82,26 +82,30 @@ struct cmd_results *cmd_bar(int argc, char **argv) {
82 ++argv; --argc; 82 ++argv; --argc;
83 } 83 }
84 84
85 if (!config->current_bar && config->reading) { 85 if (!config->current_bar) {
86 // Create new bar with default values 86 if (config->reading) {
87 struct bar_config *bar = default_bar_config(); 87 // Create new bar with default values
88 if (!bar) { 88 struct bar_config *bar = default_bar_config();
89 return cmd_results_new(CMD_FAILURE, 89 if (!bar) {
90 "Unable to allocate bar state"); 90 return cmd_results_new(CMD_FAILURE,
91 } 91 "Unable to allocate bar state");
92 }
93
94 // set bar id
95 int len = snprintf(NULL, 0, "bar-%d", config->bars->length - 1) + 1;
96 bar->id = malloc(len * sizeof(char));
97 if (bar->id) {
98 snprintf(bar->id, len, "bar-%d", config->bars->length - 1);
99 } else {
100 return cmd_results_new(CMD_FAILURE, "Unable to allocate bar ID");
101 }
92 102
93 // set bar id 103 // Set current bar
94 const int len = snprintf(NULL, 0, "bar-%d", config->bars->length - 1) + 1; 104 config->current_bar = bar;
95 bar->id = malloc(len * sizeof(char)); 105 sway_log(SWAY_DEBUG, "Creating bar %s", bar->id);
96 if (bar->id) {
97 snprintf(bar->id, len, "bar-%d", config->bars->length - 1);
98 } else { 106 } else {
99 return cmd_results_new(CMD_FAILURE, "Unable to allocate bar ID"); 107 return cmd_results_new(CMD_FAILURE, "No bar defined.");
100 } 108 }
101
102 // Set current bar
103 config->current_bar = bar;
104 sway_log(SWAY_DEBUG, "Creating bar %s", bar->id);
105 } 109 }
106 110
107 if (find_handler(argv[0], bar_config_handlers, 111 if (find_handler(argv[0], bar_config_handlers,
diff --git a/sway/commands/bar/bind.c b/sway/commands/bar/bind.c
index f94b4811..b4b5bc45 100644
--- a/sway/commands/bar/bind.c
+++ b/sway/commands/bar/bind.c
@@ -75,9 +75,6 @@ static struct cmd_results *bar_cmd_bind(int argc, char **argv, bool code,
75 if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, minargs))) { 75 if ((error = checkarg(argc, command, EXPECTED_AT_LEAST, minargs))) {
76 return error; 76 return error;
77 } 77 }
78 if (!config->current_bar) {
79 return cmd_results_new(CMD_FAILURE, "No bar defined.");
80 }
81 78
82 struct bar_binding *binding = calloc(1, sizeof(struct bar_binding)); 79 struct bar_binding *binding = calloc(1, sizeof(struct bar_binding));
83 if (!binding) { 80 if (!binding) {
diff --git a/sway/commands/bar/binding_mode_indicator.c b/sway/commands/bar/binding_mode_indicator.c
index 29c93ddc..b58d8a83 100644
--- a/sway/commands/bar/binding_mode_indicator.c
+++ b/sway/commands/bar/binding_mode_indicator.c
@@ -10,10 +10,7 @@ struct cmd_results *bar_cmd_binding_mode_indicator(int argc, char **argv) {
10 "binding_mode_indicator", EXPECTED_EQUAL_TO, 1))) { 10 "binding_mode_indicator", EXPECTED_EQUAL_TO, 1))) {
11 return error; 11 return error;
12 } 12 }
13 if (!config->current_bar) { 13 config->current_bar->binding_mode_indicator =
14 return cmd_results_new(CMD_FAILURE, "No bar defined.");
15 }
16 config->current_bar->binding_mode_indicator =
17 parse_boolean(argv[0], config->current_bar->binding_mode_indicator); 14 parse_boolean(argv[0], config->current_bar->binding_mode_indicator);
18 if (config->current_bar->binding_mode_indicator) { 15 if (config->current_bar->binding_mode_indicator) {
19 sway_log(SWAY_DEBUG, "Enabling binding mode indicator on bar: %s", 16 sway_log(SWAY_DEBUG, "Enabling binding mode indicator on bar: %s",
diff --git a/sway/commands/bar/font.c b/sway/commands/bar/font.c
index cf1f759e..62987f3e 100644
--- a/sway/commands/bar/font.c
+++ b/sway/commands/bar/font.c
@@ -9,9 +9,6 @@ struct cmd_results *bar_cmd_font(int argc, char **argv) {
9 if ((error = checkarg(argc, "font", EXPECTED_AT_LEAST, 1))) { 9 if ((error = checkarg(argc, "font", EXPECTED_AT_LEAST, 1))) {
10 return error; 10 return error;
11 } 11 }
12 if (!config->current_bar) {
13 return cmd_results_new(CMD_FAILURE, "No bar defined.");
14 }
15 char *font = join_args(argv, argc); 12 char *font = join_args(argv, argc);
16 free(config->current_bar->font); 13 free(config->current_bar->font);
17 config->current_bar->font = font; 14 config->current_bar->font = font;
diff --git a/sway/commands/bar/gaps.c b/sway/commands/bar/gaps.c
index 83480fb5..f99966b4 100644
--- a/sway/commands/bar/gaps.c
+++ b/sway/commands/bar/gaps.c
@@ -13,9 +13,6 @@ struct cmd_results *bar_cmd_gaps(int argc, char **argv) {
13 if ((error = checkarg(argc, "gaps", EXPECTED_AT_MOST, 4))) { 13 if ((error = checkarg(argc, "gaps", EXPECTED_AT_MOST, 4))) {
14 return error; 14 return error;
15 } 15 }
16 if (!config->current_bar) {
17 return cmd_results_new(CMD_FAILURE, "No bar defined.");
18 }
19 16
20 int top = 0, right = 0, bottom = 0, left = 0; 17 int top = 0, right = 0, bottom = 0, left = 0;
21 18
diff --git a/sway/commands/bar/icon_theme.c b/sway/commands/bar/icon_theme.c
index 54b7b16e..6ac07843 100644
--- a/sway/commands/bar/icon_theme.c
+++ b/sway/commands/bar/icon_theme.c
@@ -12,10 +12,6 @@ struct cmd_results *bar_cmd_icon_theme(int argc, char **argv) {
12 return error; 12 return error;
13 } 13 }
14 14
15 if (!config->current_bar) {
16 return cmd_results_new(CMD_FAILURE, "No bar defined.");
17 }
18
19 sway_log(SWAY_DEBUG, "[Bar %s] Setting icon theme to %s", 15 sway_log(SWAY_DEBUG, "[Bar %s] Setting icon theme to %s",
20 config->current_bar->id, argv[0]); 16 config->current_bar->id, argv[0]);
21 free(config->current_bar->icon_theme); 17 free(config->current_bar->icon_theme);
diff --git a/sway/commands/bar/modifier.c b/sway/commands/bar/modifier.c
index d25d01d4..983d2179 100644
--- a/sway/commands/bar/modifier.c
+++ b/sway/commands/bar/modifier.c
@@ -10,10 +10,6 @@ struct cmd_results *bar_cmd_modifier(int argc, char **argv) {
10 return error; 10 return error;
11 } 11 }
12 12
13 if (!config->current_bar) {
14 return cmd_results_new(CMD_FAILURE, "No bar defined.");
15 }
16
17 uint32_t mod = 0; 13 uint32_t mod = 0;
18 if (strcmp(argv[0], "none") != 0) { 14 if (strcmp(argv[0], "none") != 0) {
19 list_t *split = split_string(argv[0], "+"); 15 list_t *split = split_string(argv[0], "+");
diff --git a/sway/commands/bar/output.c b/sway/commands/bar/output.c
index 956c1959..6a78b30d 100644
--- a/sway/commands/bar/output.c
+++ b/sway/commands/bar/output.c
@@ -10,9 +10,6 @@ struct cmd_results *bar_cmd_output(int argc, char **argv) {
10 if ((error = checkarg(argc, "output", EXPECTED_EQUAL_TO, 1))) { 10 if ((error = checkarg(argc, "output", EXPECTED_EQUAL_TO, 1))) {
11 return error; 11 return error;
12 } 12 }
13 if (!config->current_bar) {
14 return cmd_results_new(CMD_FAILURE, "No bar defined.");
15 }
16 13
17 const char *output = argv[0]; 14 const char *output = argv[0];
18 list_t *outputs = config->current_bar->outputs; 15 list_t *outputs = config->current_bar->outputs;
diff --git a/sway/commands/bar/pango_markup.c b/sway/commands/bar/pango_markup.c
index b0958cf1..ee51390d 100644
--- a/sway/commands/bar/pango_markup.c
+++ b/sway/commands/bar/pango_markup.c
@@ -9,11 +9,8 @@ struct cmd_results *bar_cmd_pango_markup(int argc, char **argv) {
9 if ((error = checkarg(argc, "pango_markup", EXPECTED_EQUAL_TO, 1))) { 9 if ((error = checkarg(argc, "pango_markup", EXPECTED_EQUAL_TO, 1))) {
10 return error; 10 return error;
11 } 11 }
12 if (!config->current_bar) { 12 config->current_bar->pango_markup =
13 return cmd_results_new(CMD_FAILURE, "No bar defined."); 13 parse_boolean(argv[0], config->current_bar->pango_markup);
14 }
15 config->current_bar->pango_markup
16 = parse_boolean(argv[0], config->current_bar->pango_markup);
17 if (config->current_bar->pango_markup) { 14 if (config->current_bar->pango_markup) {
18 sway_log(SWAY_DEBUG, "Enabling pango markup for bar: %s", 15 sway_log(SWAY_DEBUG, "Enabling pango markup for bar: %s",
19 config->current_bar->id); 16 config->current_bar->id);
diff --git a/sway/commands/bar/position.c b/sway/commands/bar/position.c
index 4456d724..b207de0b 100644
--- a/sway/commands/bar/position.c
+++ b/sway/commands/bar/position.c
@@ -9,9 +9,6 @@ struct cmd_results *bar_cmd_position(int argc, char **argv) {
9 if ((error = checkarg(argc, "position", EXPECTED_EQUAL_TO, 1))) { 9 if ((error = checkarg(argc, "position", EXPECTED_EQUAL_TO, 1))) {
10 return error; 10 return error;
11 } 11 }
12 if (!config->current_bar) {
13 return cmd_results_new(CMD_FAILURE, "No bar defined.");
14 }
15 char *valid[] = { "top", "bottom" }; 12 char *valid[] = { "top", "bottom" };
16 for (size_t i = 0; i < sizeof(valid) / sizeof(valid[0]); ++i) { 13 for (size_t i = 0; i < sizeof(valid) / sizeof(valid[0]); ++i) {
17 if (strcasecmp(valid[i], argv[0]) == 0) { 14 if (strcasecmp(valid[i], argv[0]) == 0) {
diff --git a/sway/commands/bar/separator_symbol.c b/sway/commands/bar/separator_symbol.c
index 76e99b49..6737d4d2 100644
--- a/sway/commands/bar/separator_symbol.c
+++ b/sway/commands/bar/separator_symbol.c
@@ -8,9 +8,6 @@ struct cmd_results *bar_cmd_separator_symbol(int argc, char **argv) {
8 if ((error = checkarg(argc, "separator_symbol", EXPECTED_EQUAL_TO, 1))) { 8 if ((error = checkarg(argc, "separator_symbol", EXPECTED_EQUAL_TO, 1))) {
9 return error; 9 return error;
10 } 10 }
11 if (!config->current_bar) {
12 return cmd_results_new(CMD_FAILURE, "No bar defined.");
13 }
14 free(config->current_bar->separator_symbol); 11 free(config->current_bar->separator_symbol);
15 config->current_bar->separator_symbol = strdup(argv[0]); 12 config->current_bar->separator_symbol = strdup(argv[0]);
16 sway_log(SWAY_DEBUG, "Settings separator_symbol '%s' for bar: %s", 13 sway_log(SWAY_DEBUG, "Settings separator_symbol '%s' for bar: %s",
diff --git a/sway/commands/bar/status_command.c b/sway/commands/bar/status_command.c
index 0b58e5fa..77a73ab6 100644
--- a/sway/commands/bar/status_command.c
+++ b/sway/commands/bar/status_command.c
@@ -8,9 +8,6 @@ struct cmd_results *bar_cmd_status_command(int argc, char **argv) {
8 if ((error = checkarg(argc, "status_command", EXPECTED_AT_LEAST, 1))) { 8 if ((error = checkarg(argc, "status_command", EXPECTED_AT_LEAST, 1))) {
9 return error; 9 return error;
10 } 10 }
11 if (!config->current_bar) {
12 return cmd_results_new(CMD_FAILURE, "No bar defined.");
13 }
14 free(config->current_bar->status_command); 11 free(config->current_bar->status_command);
15 config->current_bar->status_command = NULL; 12 config->current_bar->status_command = NULL;
16 13
diff --git a/sway/commands/bar/strip_workspace_name.c b/sway/commands/bar/strip_workspace_name.c
index 1aa39359..764321a8 100644
--- a/sway/commands/bar/strip_workspace_name.c
+++ b/sway/commands/bar/strip_workspace_name.c
@@ -10,9 +10,6 @@ struct cmd_results *bar_cmd_strip_workspace_name(int argc, char **argv) {
10 "strip_workspace_name", EXPECTED_EQUAL_TO, 1))) { 10 "strip_workspace_name", EXPECTED_EQUAL_TO, 1))) {
11 return error; 11 return error;
12 } 12 }
13 if (!config->current_bar) {
14 return cmd_results_new(CMD_FAILURE, "No bar defined.");
15 }
16 13
17 config->current_bar->strip_workspace_name = 14 config->current_bar->strip_workspace_name =
18 parse_boolean(argv[0], config->current_bar->strip_workspace_name); 15 parse_boolean(argv[0], config->current_bar->strip_workspace_name);
diff --git a/sway/commands/bar/strip_workspace_numbers.c b/sway/commands/bar/strip_workspace_numbers.c
index 56c4c4a1..2d7fe1a7 100644
--- a/sway/commands/bar/strip_workspace_numbers.c
+++ b/sway/commands/bar/strip_workspace_numbers.c
@@ -10,10 +10,7 @@ struct cmd_results *bar_cmd_strip_workspace_numbers(int argc, char **argv) {
10 "strip_workspace_numbers", EXPECTED_EQUAL_TO, 1))) { 10 "strip_workspace_numbers", EXPECTED_EQUAL_TO, 1))) {
11 return error; 11 return error;
12 } 12 }
13 if (!config->current_bar) { 13
14 return cmd_results_new(CMD_FAILURE, "No bar defined.");
15 }
16
17 config->current_bar->strip_workspace_numbers = 14 config->current_bar->strip_workspace_numbers =
18 parse_boolean(argv[0], config->current_bar->strip_workspace_numbers); 15 parse_boolean(argv[0], config->current_bar->strip_workspace_numbers);
19 16
diff --git a/sway/commands/bar/swaybar_command.c b/sway/commands/bar/swaybar_command.c
index b54bafa9..0892a898 100644
--- a/sway/commands/bar/swaybar_command.c
+++ b/sway/commands/bar/swaybar_command.c
@@ -8,9 +8,6 @@ struct cmd_results *bar_cmd_swaybar_command(int argc, char **argv) {
8 if ((error = checkarg(argc, "swaybar_command", EXPECTED_AT_LEAST, 1))) { 8 if ((error = checkarg(argc, "swaybar_command", EXPECTED_AT_LEAST, 1))) {
9 return error; 9 return error;
10 } 10 }
11 if (!config->current_bar) {
12 return cmd_results_new(CMD_FAILURE, "No bar defined.");
13 }
14 free(config->current_bar->swaybar_command); 11 free(config->current_bar->swaybar_command);
15 config->current_bar->swaybar_command = join_args(argv, argc); 12 config->current_bar->swaybar_command = join_args(argv, argc);
16 sway_log(SWAY_DEBUG, "Using custom swaybar command: %s", 13 sway_log(SWAY_DEBUG, "Using custom swaybar command: %s",
diff --git a/sway/commands/bar/tray_bind.c b/sway/commands/bar/tray_bind.c
index 7fe67c42..c910d106 100644
--- a/sway/commands/bar/tray_bind.c
+++ b/sway/commands/bar/tray_bind.c
@@ -12,9 +12,6 @@ static struct cmd_results *tray_bind(int argc, char **argv, bool code) {
12 if ((error = checkarg(argc, command, EXPECTED_EQUAL_TO, 2))) { 12 if ((error = checkarg(argc, command, EXPECTED_EQUAL_TO, 2))) {
13 return error; 13 return error;
14 } 14 }
15 if (!config->current_bar) {
16 return cmd_results_new(CMD_FAILURE, "No bar defined.");
17 }
18 15
19 struct tray_binding *binding = calloc(1, sizeof(struct tray_binding)); 16 struct tray_binding *binding = calloc(1, sizeof(struct tray_binding));
20 if (!binding) { 17 if (!binding) {
diff --git a/sway/commands/bar/tray_output.c b/sway/commands/bar/tray_output.c
index 16e16f60..8bfdf193 100644
--- a/sway/commands/bar/tray_output.c
+++ b/sway/commands/bar/tray_output.c
@@ -13,10 +13,6 @@ struct cmd_results *bar_cmd_tray_output(int argc, char **argv) {
13 return error; 13 return error;
14 } 14 }
15 15
16 if (!config->current_bar) {
17 return cmd_results_new(CMD_FAILURE, "No bar defined.");
18 }
19
20 list_t *outputs = config->current_bar->tray_outputs; 16 list_t *outputs = config->current_bar->tray_outputs;
21 if (!outputs) { 17 if (!outputs) {
22 config->current_bar->tray_outputs = outputs = create_list(); 18 config->current_bar->tray_outputs = outputs = create_list();
diff --git a/sway/commands/bar/tray_padding.c b/sway/commands/bar/tray_padding.c
index f43cfe4f..f90b6003 100644
--- a/sway/commands/bar/tray_padding.c
+++ b/sway/commands/bar/tray_padding.c
@@ -15,9 +15,6 @@ struct cmd_results *bar_cmd_tray_padding(int argc, char **argv) {
15 return error; 15 return error;
16 } 16 }
17 17
18 if (!config->current_bar) {
19 return cmd_results_new(CMD_FAILURE, "No bar defined.");
20 }
21 struct bar_config *bar = config->current_bar; 18 struct bar_config *bar = config->current_bar;
22 19
23 char *end; 20 char *end;
diff --git a/sway/commands/bar/workspace_buttons.c b/sway/commands/bar/workspace_buttons.c
index 792ef605..6bfb1616 100644
--- a/sway/commands/bar/workspace_buttons.c
+++ b/sway/commands/bar/workspace_buttons.c
@@ -9,10 +9,7 @@ struct cmd_results *bar_cmd_workspace_buttons(int argc, char **argv) {
9 if ((error = checkarg(argc, "workspace_buttons", EXPECTED_EQUAL_TO, 1))) { 9 if ((error = checkarg(argc, "workspace_buttons", EXPECTED_EQUAL_TO, 1))) {
10 return error; 10 return error;
11 } 11 }
12 if (!config->current_bar) { 12 config->current_bar->workspace_buttons =
13 return cmd_results_new(CMD_FAILURE, "No bar defined.");
14 }
15 config->current_bar->workspace_buttons =
16 parse_boolean(argv[0], config->current_bar->workspace_buttons); 13 parse_boolean(argv[0], config->current_bar->workspace_buttons);
17 if (config->current_bar->workspace_buttons) { 14 if (config->current_bar->workspace_buttons) {
18 sway_log(SWAY_DEBUG, "Enabling workspace buttons on bar: %s", 15 sway_log(SWAY_DEBUG, "Enabling workspace buttons on bar: %s",
diff --git a/sway/commands/bar/wrap_scroll.c b/sway/commands/bar/wrap_scroll.c
index decd238d..f57e393d 100644
--- a/sway/commands/bar/wrap_scroll.c
+++ b/sway/commands/bar/wrap_scroll.c
@@ -9,10 +9,7 @@ struct cmd_results *bar_cmd_wrap_scroll(int argc, char **argv) {
9 if ((error = checkarg(argc, "wrap_scroll", EXPECTED_EQUAL_TO, 1))) { 9 if ((error = checkarg(argc, "wrap_scroll", EXPECTED_EQUAL_TO, 1))) {
10 return error; 10 return error;
11 } 11 }
12 if (!config->current_bar) { 12 config->current_bar->wrap_scroll =
13 return cmd_results_new(CMD_FAILURE, "No bar defined.");
14 }
15 config->current_bar->wrap_scroll =
16 parse_boolean(argv[0], config->current_bar->wrap_scroll); 13 parse_boolean(argv[0], config->current_bar->wrap_scroll);
17 if (config->current_bar->wrap_scroll) { 14 if (config->current_bar->wrap_scroll) {
18 sway_log(SWAY_DEBUG, "Enabling wrap scroll on bar: %s", 15 sway_log(SWAY_DEBUG, "Enabling wrap scroll on bar: %s",